gpt4 book ai didi

python - 使用 dataclasses.MISSING 作为 Python 数据类的可选参数值?

转载 作者:行者123 更新时间:2023-12-02 01:57:13 27 4
gpt4 key购买 nike

我想使 set 参数可选,但仍允许 None 为有效值。基于the documentation , 它建议 dataclasses.MISSING 可以使用默认值来帮助实现这一点。

As shown above, the MISSING value is a sentinel object used to detectif some parameters are provided by the user. This sentinel is usedbecause None is a valid value for some parameters with a distinctmeaning. No code should directly use the MISSING value.

但按如下方式使用:

import dataclasses
from dataclasses import dataclass, field

@dataclass
class Var:
get: list
set: list = dataclasses.MISSING

def __post_init__(self):
if self.set is dataclasses.MISSING:
self.set = self.get

print(Var(get=['Title']))

我收到一个错误:

Traceback (most recent call last):
File "main.py", line 31, in <module>
print(Var(get=['Title']))
TypeError: __init__() missing 1 required positional argument: 'set'

最佳答案

No code should directly use the MISSING value.

上述部分在文档中注明是有原因的。因此,我们应该尽可能避免在我们的应用程序代码中使用 MISSING 用法(和导入)。在这种情况下,使用 MISSING 根本不适用于我们的用例。

假设用法(避免直接使用 MISSING 标记值,而是使用 dataclasses.field(...):

from dataclasses import dataclass, field
from typing import Optional


@dataclass
class Var:
get: list[str]
set: Optional[list[str]] = field(default=None)


print(Var(get=['Title']))
# Var(get=['Title'], set=None)

但是 MISSING 实际用在哪里呢?

MISSINGdataclasses 模块在幕后使用的哨兵对象,因为它很神奇。

您可以检查 dataclasses.field 的源代码并在那里找到它的清晰用法:

def field(*, default=MISSING, default_factory=MISSING, init=True, repr=True,
hash=None, compare=True, metadata=None):

您会看到 default 等字段的声明默认值是 default=MISSING 而不是 default=None。这样做主要是为了确定用户是否实际将 defaultdefault_factory 的值传递给工厂函数 fields。例如,像我们在上面的示例中所做的那样传递 field(default=None) 是完全有效的;但是,由于默认值实际上是 MISSINGdataclasses 能够检测到已为该参数传递了一个值(None 的值>).

关于python - 使用 dataclasses.MISSING 作为 Python 数据类的可选参数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69505878/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com