检查类中的字段是否正在键入的最佳方法是什么?可选?
示例代码:
from typing import Optional
import re
from dataclasses import dataclass, fields
@dataclass(frozen=True)
class TestClass:
required_field_1: str
required_field_2: int
optional_field: Optional[str]
def get_all_optional_fields(fields) -> list:
return [field.name for field in fields if __is_optional_field(field)]
def __is_optional_field(field) -> bool:
regex = '^typing.Union\[.*, NoneType\]$'
return re.match(regex, str(field.type)) is not None
print(get_all_optional_fields(fields(TestClass)))
fields
来自dataclasses
,我想列出所有Optional
字段。我目前正在解决该问题的方法是使用基于正则表达式的字段名称,但我不喜欢这种方法。有更好的方法吗?
最佳答案
Optional[X]
等效于Union[X, None]
。所以你可以做
import re
from typing import Optional
from dataclasses import dataclass, fields
@dataclass(frozen=True)
class TestClass:
required_field_1: str
required_field_2: int
optional_field: Optional[str]
def get_optional_fields(klass):
class_fields = fields(klass)
for field in class_fields:
if (
hasattr(field.type, "__args__")
and len(field.type.__args__) == 2
and field.type.__args__[-1] is type(None)
):
# Check if exactly two arguments exists and one of them are None type
yield field.name
print(list(get_optional_fields(TestClass)))
关于python - 检查字段是否在键入。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56832881/