Я хотел бы знать, можно ли получить доступ к аннотациям типов для переменных во время выполнения так же, как вы можете использовать запись __annotations__
в inspect.getmembers()
для методов и функций.
> a:Optional[str]=None
> type(a)
<class 'NoneType'>
> a:str=None
> type(a)
<class 'NoneType'>
Спасибо.
locals()
и globals()
отслеживайте аннотации переменных в ключе __annotations__
.
>>> from typing import *
>>> a: Optional[int] = None
>>> locals()['__annotations__']
{'a': typing.Union[int, NoneType]}
>>> locals()['__annotations__']['a']
typing.Union[int, NoneType]
>>>
>>> foo = 0
>>> bar: foo
>>> locals()['__annotations__']['bar']
0
>>>
>>> baz: List[str]
>>> locals()['__annotations__']['baz']
typing.List[str]
Черпая вдохновение из @TrebledJ, вот вспомогательная функция для использования REPL:
>>> def get_annot(var: str) -> str:
if var in globals():
return globals()["__annotations__"].get(var, "Un-annotated Variable")
else:
return "Undefined variable"
>>> var: int = 5
>>> get_annot(var)
int
Ищет переменную в глобальном словаре и возвращает аннотацию, если она определена как а также с аннотацией.