python - python - 如何检查Union [...]中的任何参数在python中是否为None?
问题描述
我想过滤 Union[..] 中的任何参数为无的代码。识别无参数的最佳方法是什么?
我知道参数的顺序在 Union[] 中并不重要(从输入 import Union 开始),但我如何进行常见的检查(可能是一个函数)来检测 None 参数。
from typing import Union
Union[T, None]
解决方案
您可以使用函数属性__annotations__
:
def my_func(a: Union[int, None], b: int, c: str):
print(a,b,c)
print(my_func.__annotations__) # {'a': typing.Union[int, NoneType], 'b': <class 'int'>, 'c': <class 'str'>}
现在我们可以做一些事情以编程方式检查它:
from typing import _GenericAlias
def check_if_func_accepts_none(func):
for key in func.__annotations__:
if isinstance(func.__annotations__[key], type(None)):
return True
elif isinstance(func.__annotations__[key], _GenericAlias) and type(None) in func.__annotations__[key].__args__:
return True
return False
例子:
>>> def b(a:int, b:None):
... print('hi')
...
>>> def c(x:Union[None,str], y:int):
... print('hi')
...
>>> def d(z: int, s:str):
... print('hi')
...
>>> check_if_func_accepts_none(b)
True
>>> check_if_func_accepts_none(c)
True
>>> check_if_func_accepts_none(d)
False
>>>
编辑:回答您的评论,Union
直接检查对象:
type(None) in obj.__args__
True
如果None
存在则返回,False
否则返回(假设obj
是 a Union
)
推荐阅读
- javascript - 滑块根据值显示单词
- typescript - 使用 Firestore 实时快照侦听器,arrayUnion 和 arrayRemove 是否会触发从服务器重新加载整个阵列?
- php - PHP 输出和输入 AVG
- r - 取出r中字符串空格中间的字符
- html - CSS 过渡属性表现得很奇怪
- php - PHP Laravel 创建和实例化类
- python - 如何有效地处理大的排列迭代?
- generics - 如何将特征对象传递给在向量的向量中也具有统一类型的向量?
- javascript - 如何在所选文本的文本区域中转换文本大小写?
- android - 如何正确取消时钟应用程序中AlarmManager设置的AlarmClock闹钟?