当我在以下代码上运行mypy时,我看到几个错误:
from typing import Callable, Type
def class_creator(outside_reference: Callable[[str], None]) -> Type[object]:
class SomeClass():
reference: Callable[[str], None]
def __init__(self) -> None:
self.reference = outside_reference
super().__init__()
def __str__(self):
self.reference("SomeClass instance")
return SomeClass
def callback(string: str) -> None:
print("Prepping: " + string)
instance = class_creator(callback)()
print(instance)
以下是错误:
test.py:9: error: Cannot assign to a method
test.py:9: error: Invalid self argument "SomeClass" to attribute function "reference" with type "Callable[[str], None]"
test.py:9: error: Incompatible types in assignment (expression has type "Callable[[str], None]", variable has type "Callable[[], None]")
第9行是self.reference = outside_reference
。
我基本上是肯定的,我只是误解了一些东西,但我只是看不出我哪里出错了。
这是可重复性最小的参考。如果我将类型从Callable[[str], None]
更改为int
(并且实际上没有调用它),那么它运行正常而不显示任何错误。只有当我切换到Callable
时才开始显示这些错误。
我的注释应该在这里?
目前,MyPy并不支持你这样做。在GitHub问题708:https://github.com/python/mypy/issues/708中跟踪对此模式的支持
在大多数情况下,最接近的模式是使用类似execute
的方法定义抽象类,然后让调用者将其与它们的实现子类化,实例化它,并提供实例作为参数而不是回调。您可以在较旧的Java代码库(Java 8之前)中看到此方法,作为匿名内部类的常见用例。当然,这是乏味的。
或者,你可以简单地让mypy忽略违规行为。