对Callable的mypy类型检查认为成员变量是一种方法

问题描述 投票:1回答:1

当我在以下代码上运行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时才开始显示这些错误。

我的注释应该在这里?

python mypy
1个回答
0
投票

目前,MyPy并不支持你这样做。在GitHub问题708:https://github.com/python/mypy/issues/708中跟踪对此模式的支持

在大多数情况下,最接近的模式是使用类似execute的方法定义抽象类,然后让调用者将其与它们的实现子类化,实例化它,并提供实例作为参数而不是回调。您可以在较旧的Java代码库(Java 8之前)中看到此方法,作为匿名内部类的常见用例。当然,这是乏味的。

或者,你可以简单地让mypy忽略违规行为。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.