如何解决如何检查对象是否可以用作 Python 中的类型注释?
根据PEP484,允许使用以下内容作为类型注解。
v: int # built-in class
v: MyABC # abstract base class
v: types.FunctionType # types defined in `types` module
v: MyClass # user-defined class
v: None # None is a value,but ok
v: typing.List[int] # Generics
我想检查 variable
是否可以用作类型注释:
def is_annotation(v: Any) -> bool:
# How to implement?
is_annotation(int) == True
is_annotation(1) == False
is_annotation(types.FunctionType) == True
is_annotation(None) == True
解决方法
Typing 有一个内部函数 (_type_check),用于确定注释是否有效。该函数的编写方式是,如果注释无效,则会引发类型错误。我们可以通过调用 _type_check 并在引发异常时返回 false 的函数来懒惰地利用它。
import typing,types
from typing import Any
def is_annotation(v: Any) -> bool:
try:
typing._type_check(v,'Not valid')
return True
except TypeError:
return False
或者,我们可以重写该函数以将其行为从引发异常更改为返回 False。
def is_annotation(v: Any) -> bool:
if v is None:
return True
if isinstance(v,str):
return True
if (isinstance(v,typing._GenericAlias) and
v.__origin__ in (typing.Generic,typing.Protocol)):
return False
if (isinstance(v,typing._SpecialForm) and v not in (typing.Any,typing.NoReturn) or
v in (typing.Generic,typing.Protocol)):
return False
if isinstance(v,(type,typing.TypeVar,typing.ForwardRef)):
return True
if not callable(v):
return False
return True
print(is_annotation(int))
print(is_annotation(1))
print(is_annotation(types.FunctionType))
print(is_annotation(10.0))
print(is_annotation(typing.List))
print(is_annotation('str'))
print(is_annotation(None))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。