【发布时间】:2020-09-27 12:39:36
【问题描述】:
我有一个通用类,比如
from typing import Generic, TypeVar, List
T = TypeVar('T')
@my_decorator
class Foo(Generic[T]):
pass
f: Foo[int] = Foo()
g: Foo[List[float]] = Foo()
有没有一种简洁的方法可以在装饰器中获取构造函数调用Foo[int], Foo[List[float]] 的类型注释?我想在运行时做一些类型检查。
我可以通过装饰器访问Foo 的构造函数调用,我什至可以通过使用inspect.stack() 和inspect.getsource(my_frame) 以非常不雅的方式获得构造函数调用的代码行f: Foo[int] = Foo()。然后我可以通过一些字符串操作得到Foo[int]。
除了这是一种非常肮脏的方法之外,它只能将类型作为字符串获取。但我需要实际的类型。在本例中,我可以使用eval() 来“解析”字符串并将其转换为类型。但这不适用于自定义类,例如以下示例:
from typing import Generic, TypeVar, List
T = TypeVar('T')
class Bar:
pass
@my_decorator
class Foo(Generic[T]):
pass
h: Foo[List[Bar]] = Foo()
在这种情况下,我不能使用eval(),因为我不知道如何才能获得正确的context。
我喜欢得到类似my_file.Foo[typing.List[my_file.Bar]] 这样的东西,它可以让我在运行时进行类型检查。
那么有什么干净的方法吗?或者至少有一种(肮脏的)方法可以为eval()“解析”字符串获得正确的上下文?
【问题讨论】:
-
您能否提供
my_decorator的示例代码?目前尚不清楚您要达到的目标。
标签: python python-3.x generics annotations typing