Python 3.10及以上是否有内置函数查询类型提示的可选性?
Python标准库中判断类型提示是否允许None值的方案
Python标准库中没有单个直接函数可以完成你要的需求,但可以通过typing模块提供的工具函数组合实现,完全基于标准库,无需自定义全新逻辑。
核心思路
所有允许None的类型提示(包括Optional[T]、Union[T, None]、int|None这类Python 3.10+的语法糖)本质都属于Union类型变体,且参数中包含type(None)。我们可以用以下两个标准库函数解析类型:
typing.get_origin():获取类型提示的原始构造器(比如Optional[int]和int|None的origin都是Union)typing.get_args():获取类型提示的参数列表
实现代码
from typing import get_origin, get_args, Union, Optional from dataclasses import dataclass, fields def allows_none(type_hint) -> bool: origin = get_origin(type_hint) # 处理Union/Optional/|None这类情况 if origin is Union: return type(None) in get_args(type_hint) # 单独判断类型就是None的情况 return type_hint is type(None) # 测试你的示例类 @dataclass class A: foo : Optional[int] = None bar : int|None = None baz : Union[int, float, None] = None x : int = 1 # 验证结果 for field in fields(A): print(f"{field.name}: {allows_none(field.type)}")
输出结果
foo: True bar: True baz: True x: False
这个实现完全依赖Python标准库的工具函数,覆盖了你需要的所有场景,无需自己从头解析类型语法。
内容的提问来源于stack exchange,提问作者Ross Bencina
相关产品推荐
相关产品推荐

