相关疑难解决方法(0)

如何指定方法的返回类型与python中的类本身相同?

我在python 3中有以下代码:

class Position:

    def __init__(self, x: int, y: int):
        self.x = x
        self.y = y

    def __add__(self, other: Position) -> Position:
        return Position(self.x + other.x, self.y + other.y)
Run Code Online (Sandbox Code Playgroud)

但是我的编辑器(PyCharm)说无法解析引用位置(在_add__方法中).我该如何指定我希望返回类型是类型__add__

编辑:我认为这实际上是一个PyCharm问题.它实际上使用其警告中的信息和代码完成

但如果我错了,请纠正我,并需要使用其他语法.

python typing pycharm python-3.x python-3.5

277
推荐指数
7
解决办法
4万
查看次数

通过子类化改变 Python 的类型参数

Python 的类型系统允许在类中使用泛型:

class A(Generic[T]):
    def get_next(self) -> T
Run Code Online (Sandbox Code Playgroud)

这非常方便。然而,即使在 3.11 中使用 Self 类型,我也找不到T在不指定类名的情况下更改类型参数 (the ) 的方法。以下是 PEP 673 中的推荐用法: 自类型:https ://peps.python.org/pep-0673/a

class Container(Generic[T]):
    def foo(
        self: Container[T],
    ) -> Container[str]:
        # maybe implementing something like:
        return self.__class__([str(x) for x in self])
Run Code Online (Sandbox Code Playgroud)

问题是如果我想子类化容器:

class SuperContainer(Container[T]):
    def time_travel(self): ...
Run Code Online (Sandbox Code Playgroud)

然后,如果我有一个 SuperContainer 的实例并在其上调用 foo ,则输入将会错误,并认为它是一个 Container 而不是 SuperContainer。

sc = SuperContainer([1, 2, 3])
sc2 = sc.foo()
reveal_type(sc2)  # mypy: Container[str]
sc2.time_travel()  # typing error: only SuperContainers can time-travel
isinstance(sc2, SuperContainer) …
Run Code Online (Sandbox Code Playgroud)

python generics typing subclass mypy

7
推荐指数
1
解决办法
826
查看次数

标签 统计

python ×2

typing ×2

generics ×1

mypy ×1

pycharm ×1

python-3.5 ×1

python-3.x ×1

subclass ×1