相关疑难解决方法(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中类型注释的自引用或转发引用

我试图找出类型的自引用如何与python3的类型注释一起工作 - 文档没有指定任何关于此的内容.

举个例子:

from typing import TypeVar, Optional, Generic

T = TypeVar('T')
class Node(Generic[T]):
    left = None
    right = None
    value = None

    def __init__(
        self, value: Optional[T],
        left: Optional[Node[T]]=None,
        right: Optional[Node[T]]=None,
    ) -> None:
        self.value = value
        self.left = left
        self.right = right
Run Code Online (Sandbox Code Playgroud)

此代码生成错误:

Traceback (most recent call last):
  File "node.py", line 4, in <module>
    class Node(Generic[T]):
  File "node.py", line 12, in Node
    right: Optional[Node[T]]=None,
NameError: name 'Node' is not defined
Run Code Online (Sandbox Code Playgroud)

这是使用Python 3.5.1

python typing typechecking python-3.x python-3.5

12
推荐指数
1
解决办法
5151
查看次数

如何避免由python中的指针属性的类型提示引起的循环依赖

考虑两个模块(在同一文件夹中):

首先,person.py

from typing import List
from .pet import Pet


class Person:
    def __init__(self, name: str):
        self.name = name
        self.pets = [] # type: List[Pet]

    def adopt_a_pet(self, pet_name: str):
        self.pets.append(Pet(pet_name))
Run Code Online (Sandbox Code Playgroud)

然后是pet.py

from .person import Person


class Pet:
    def __init__(self, name: str, owner: Person):
        self.name = name
        self.owner = owner
Run Code Online (Sandbox Code Playgroud)

由于循环依赖,上述代码无法正常工作。您会得到一个错误:

ImportError: cannot import name 'Person'
Run Code Online (Sandbox Code Playgroud)

使其工作的一些方法:

  1. 将类Person和Pet的定义保存在同一文件中。
  2. 删除pet.owner属性(方便使用的指针)
  3. 不要在会引起循环引用的地方使用type-hinting / annotation:

例如:

class Pet:
    def __init__(self, name: str, owner):
Run Code Online (Sandbox Code Playgroud)

到目前为止,我列出的所有选项中都有一些缺点。

还有另一种方法吗?一个让我能够

  • 将类拆分为不同的文件
  • 将类型注释与指针结合使用,如图所示

或者:是否有充分的理由改而采用我已经列出的解决方案之一?

python annotations circular-dependency type-hinting cross-reference

6
推荐指数
2
解决办法
627
查看次数