【发布时间】:2019-12-19 07:49:03
【问题描述】:
对于完整的上下文,我希望制作一些对测试进行更好的静态分析的装饰器。在理想的世界中,它会像这样工作:
class SomeTest(unittest.TestCase):
@login_decorate
def test_login(self):
reveal_type(self.user) # type: User
@anonymous_decorate
def test_anonymous(self):
reveal_type(self.user) # type: None
刚开始,我试图创建一个看起来像这样的装饰器:
def login_decorate(func: Callable[[unittest.TestCase], None]):
def decorated_function(self: unittest.TestCase):
self.user = User()
return func(self)
return decorated_function
但是当我运行 mypy 时,我得到了这个错误:
error: Argument 1 to "login_decorate" has incompatible type "Callable[[SomeTest], None]";
expected "Callable[[TestCase], None]"
经过一番思考,我同意这是 mypy 由于逆变的正确行为,但这并不能帮助我解决我的问题。
有没有什么方法可以让装饰器优雅地工作而无需使用Any 显式破解类型?
【问题讨论】:
标签: python types static-analysis mypy