python 如何获取一个 UnionType 的子成员?
python 如何获取一个 UnionType 的子成员?
python 如何判断指定类型是否在 UnionType 中?
我有一个需求,就是判断一个 func 的 name 参数的 typing hints 是不是包含了 str,如果包含了就返回 True,否则返回 False
比如
def func(name:int):pass
就是 False,因为 name 的 typing hints 是 intdef func(name:int|None):pass
就是 False,因为 name 的 typing hints 不包含 strdef func(name:float):pass
就是 False,因为 name 的 typing hints 不包含 strdef func(name:str|None):pass
就是 True,因为 name 的 typing hints 包含 strdef func(name:str):pass
就是 True,因为 name 的 typing hints 包含 str
我遇到的问题是,当 typing hints 只有一个 type 的时候,我可以直接通过 from inspect import signature 的 parameter.annotation 来判断,但是当 typing hints 使用了 | 的时候,parameter.annotation 的 type 就是 types.UnionType 了,而这个 types.UnionType 貌似没有办法通过 in 等操作符,来判断 str 是不是在这个 types.UnionType 中;types.UnionType 也不能用 for 迭代已获取其中的子元素!
例如下面的代码:
from typing import Union, Callablefrom types import UnionType
from inspect import signature
from loguru import logger
def check_func_args_hints(func: Callable)->bool:
typed_signature = signature(func).parameters.items()
# 我需要获取这个 func 函数的 name 参数,是否支持 str 这个 typing_hint
for index, (parameter_name, parameter) in enumerate(typed_signature):
if parameter_name!='name':
continue
logger.debug(parameter.annotation)
logger.debug(type(parameter.annotation))
logger.debug(f'----------------')
def get_score(name: str | None = None) -> float | None:
pass
check_func_args_hints(get_score)
输出
2022-10-04 19:06:26.472 | DEBUG | __main__:check_func_args_hints:17 - str | None2022-10-04 19:06:26.472 | DEBUG | __main__:check_func_args_hints:18 - <class 'types.UnionType'>
2022-10-04 19:06:26.472 | DEBUG | __main__:check_func_args_hints:19 - ----------------
我该怎么办?
回答:
typing.get_args
可以得到 generic type 的“参数”:
str in typing.get_args(parameter.annotation)
- 直接使用 isinstance 判断一个字符串(比如"")是否是这个类型的:
isinstance("", parameter.annotation)
以上是 python 如何获取一个 UnionType 的子成员? 的全部内容, 来源链接: utcz.com/p/938632.html