检查类中的字段是否正在键入的最佳方法是什么?可选?

示例代码:

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/

10-11 22:34
查看更多