gpt4 book ai didi

python - 检查字段是否正在输入。可选

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:04 24 4
gpt4 key购买 nike

检查类中的字段是否为 typing.Optional 的最佳方法是什么?

示例代码:

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 字段。我现在正在做的是使用基于字段名称的正则表达式来解决它,但我不喜欢这种方法。有更好的方法吗?

最佳答案

作为引用,Python 3.8(2019 年 10 月首次发布)向 typing 模块添加了 get_originget_args 函数。

示例来自 docs :

assert get_origin(Dict[str, int]) is dict
assert get_args(Dict[int, str]) == (int, str)

assert get_origin(Union[int, str]) is Union
assert get_args(Union[int, str]) == (int, str)

这将允许:

def is_optional(field):
return typing.get_origin(field) is Union and \
type(None) in typing.get_args(field)

对于较旧的 Python,这里有一些兼容性代码:

# Python >= 3.8
try:
from typing import Literal, get_args, get_origin
# Compatibility
except ImportError:
get_args = lambda t: getattr(t, '__args__', ()) \
if t is not Generic else Generic
get_origin = lambda t: getattr(t, '__origin__', None)

关于python - 检查字段是否正在输入。可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56832881/

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