栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Python中创建嵌套的数据类对象

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Python中创建嵌套的数据类对象

这是一个具有与

dataclasses
模块本身的复杂度相匹配的复杂度的请求:这意味着,实现此“嵌套字段”功能的最佳方法可能是定义一个类似于的新装饰器
@dataclass

值得一提的是,如果不需要该

__init__
方法的签名来反映字段及其默认值,例如通过调用渲染的类
dataclass
,则可以简单得多:类装饰器将调用原始装饰器
dataclass

并为其包装一些功能生成的
__init__
方法可以使用简单的
...(*args, **kwargs):
样式功能来实现。

换句话说,要做的就是对生成的

__init__
方法进行包装,该方法将检查在“
kwargs”中传递的参数,检查是否有任何对应于“数据类字段类型”的参数,如果是,则在调用之前生成嵌套对象原来的
__init__
。也许用英语比用Python拼写更难:

from dataclasses import dataclass, is_dataclassdef nested_dataclass(*args, **kwargs):    def wrapper(cls):        cls = dataclass(cls, **kwargs)        original_init = cls.__init__        def __init__(self, *args, **kwargs): for name, value in kwargs.items():     field_type = cls.__annotations__.get(name, None)     if is_dataclass(field_type) and isinstance(value, dict):          new_obj = field_type(**value)          kwargs[name] = new_obj original_init(self, *args, **kwargs)        cls.__init__ = __init__        return cls    return wrapper(args[0]) if args else wrapper

请注意,除了不必担心

__init__
签名之外,这还忽略了传递
init=False
-因为无论如何它都是毫无意义的。

if
返回行中的负责此工作,可以使用命名参数调用它,也可以像
dataclass
本身一样直接作为装饰器)

并在交互式提示上:

In [85]: @dataclass    ...: class A:    ...:     b: int = 0    ...:     c: str = ""    ...:In [86]: @dataclass    ...: class A:    ...:     one: int = 0    ...:     two: str = ""    ...:         ...:In [87]: @nested_dataclass    ...: class B:    ...:     three: A    ...:     four: str    ...:In [88]: @nested_dataclass    ...: class C:    ...:     five: B    ...:     six: str    ...:         ...:In [89]: obj = C(five={"three":{"one": 23, "two":"narf"}, "four": "zort"}, six="fnord")In [90]: obj.five.three.twoOut[90]: 'narf'

如果您希望保留签名,我建议使用

dataclasses
模块本身中的私有帮助器函数来创建一个新的
__init__



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574775.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号