Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查dataclass字段是否具有默认值的Python方法_Python_Python 3.x_Python Dataclasses - Fatal编程技术网

检查dataclass字段是否具有默认值的Python方法

检查dataclass字段是否具有默认值的Python方法,python,python-3.x,python-dataclasses,Python,Python 3.x,Python Dataclasses,我最近一直在使用Python3.7,并在寻找利用新数据类的方法。基本上,我有一个方法可以迭代dataclass字段并检查它们是否有默认值: from dataclasses import fields, MISSING @classmethod def from_json(cls) datacls_fields = fields(cls) for field in datacls_fields: if (field.default != MISSING):

我最近一直在使用Python3.7,并在寻找利用新数据类的方法。基本上,我有一个方法可以迭代dataclass字段并检查它们是否有默认值:

from dataclasses import fields, MISSING

@classmethod
def from_json(cls)
    datacls_fields = fields(cls)
    for field in datacls_fields:
        if  (field.default != MISSING):
            #...
然而在官方文件中,它说:

缺失值是用于检测的sentinel对象 如果提供了默认和默认工厂参数。这 之所以使用sentinel,是因为“无”是默认值的有效值无代码 应直接使用缺少的值。


有人知道一种更好的/更像蟒蛇的方法吗

这是
dataclasses.py中python源代码中
缺失的定义:

#用于检测是否提供参数的哨兵对象。使用
#一节课,让它有更好的表现。
类\u缺少\u类型:
通过
缺失=_缺失_类型()
定义非常清楚,其用例仅用于检查是否提供了参数,并区分
None
的值和未应用的值:

def my_func(a=缺失):
如果没有丢失,请执行以下操作:
#已经提供了一个值,不管他的值是多少
因此,在代码中使用它进行值比较完全可以。通过告诉任何代码都不应直接使用缺少的值,他们只是警告我们该变量没有特定用途(用于比较的除外),不应在代码中使用,以避免意外行为

您应该更新您的代码以使用更具Python风格的语法
不丢失

数据类导入字段中的
,缺少
@类方法
来自_json(cls)的def
datacls_fields=字段(cls)
对于datacls_字段中的字段:
如果未缺少field.default:

我认为pythonic解决方案依赖于使用magic
\uuuu dict\uuuu
(文档:)

基本上,当在对象实例上使用时,它返回字段-值对(键值)的字典

为了检查这些是否是默认的,我只需将给定实例上的字典与默认无名对象上创建的字典进行比较

代码可能更具解释性

另外,这是所有字段是否都有默认值的答案。如果您需要关于哪些字段没有默认值的确切信息,这是我建议的解决方案(基于与上述相同的逻辑,但不是比较字典是否相等,而是我们发现它们之间的差异):

使用此代码时的输出:

{}
{'a': 5}

有关如何在两个字典之间找到差异的更多信息,请参阅。

也许python式的问题可能是:为什么需要找出具有默认值的字段?我认为使用
MISSING
的警告只是说它不应该是代码中有意义的值。例如,如果您的一个数据类有一个默认值为
MISSING
的字段,这可能会导致各种奇怪的行为。在这样的检查中使用它不会引起任何问题。我认为,正如@PatrickHaugh所说,您的代码是正确的,并且没有真正做任何危险的事情。如果有什么不同的话,为了使这个更具python风格,我会使用
is not MISSING
并在条件周围放上括号。
# Need the actual fields back?
x_dict = x.__dict__
y_dict = y.__dict__
default = Foo().__dict__
print(dict(set(x_dict.items()) - set(default.items())))
print(dict(set(y_dict.items()) - set(default.items())))
{}
{'a': 5}