相关疑难解决方法(0)

为正在定义的类型的对象键入Hinting

我收到错误:

NameError: name 'OrgUnit' is not defined
Run Code Online (Sandbox Code Playgroud)
class OrgUnit(object):

    def __init__(self,
                 an_org_name: str,
                 its_parent_org_unit: OrgUnit= None
                 ):
        self.org_unit_name = an_org_name
        self.parent_org_unit = its_parent_org_unit

    def __str__(self):
        if self.parent_org_unit:
            parent_org_unit_name = self.parent_org_unit.__str__()
            return parent_org_unit_name + "->" + self.org_unit_name
        else:
            return self.org_unit_name


if __name__ == '__main__':
    ibm_worldwide = OrgUnit("IBM_Worldwide")
    ibm_usa = OrgUnit("IBM_USA", ibm_worldwide)
    ibm_asia = OrgUnit("IBM_Asia", ibm_worldwide)
    ibm_china = OrgUnit("IBM_China", ibm_asia)
    print(ibm_worldwide)
    print(ibm_usa)
    print(ibm_asia)
    print(ibm_china)
Run Code Online (Sandbox Code Playgroud)

我确信这是一个已知的范例,因为它似乎是一个非常常见的分层类使用问题(自引用类).我知道我可以改变的类型its_parent_org_unitobject和它的作品,但是这似乎是错误的做法,主要是因为它泄水我检查类型的我的电话的能力.随着its_parent_org_unit改变是一种类型的object我得到正确的结果:

IBM_Worldwide
IBM_Worldwide->IBM_USA
IBM_Worldwide->IBM_Asia
IBM_Worldwide->IBM_Asia->IBM_China
Run Code Online (Sandbox Code Playgroud)

我对这些想法和建议持开放态度.做这种事情最"pythonic"的方法是什么?

PS:这种"自引用类"范例/问题的名称是什么,我可以用来查找其他建议?

python class type-hinting

13
推荐指数
1
解决办法
1586
查看次数

如果构造函数参数无效,如何返回None

目前我有类似的东西

if name and password:
     user = User(name, password)
     ...do stuff
Run Code Online (Sandbox Code Playgroud)

我想重构一下:

user = User(name, password)
if user:
     ...do stuff
Run Code Online (Sandbox Code Playgroud)

我创建了一个User()类:

class User():
    def __init__(self, name, password):
        if name and password:
            self.name, self.password = name, password
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,即使name或者passwordNone,user仍然被实例化(空,但仍然存在,所以if user:测试为真).

如何将我不会实例基于特定参数的对象?

python oop class

10
推荐指数
1
解决办法
1万
查看次数

返回 Enum 成员的类型提示 Enum @classmethod

我已经enum.Enum与几个成员一起编写了一个类型。现在我想编写一个“选择器” ,它将返回基于参数@classmethod的成员之一,但我不知道如何正确输入提示Enum

这是我到目前为止所要做的:

from enum import Enum, auto
from typing import TypeVar, Type

_StringSizeT = TypeVar("_StringSizeT", bound="StringSize")
class StringSize(Enum):

    SMALL = auto()
    BIG = auto()

    @classmethod
    def from_string(cls: Type[_StringSizeT], source_string: str) -> _StringSizeT:
        n_chars = len(source_string)
        if n_chars <= 10:
            return cls.SMALL
        return cls.BIG
Run Code Online (Sandbox Code Playgroud)

上面使用TypeVar()等 是我尝试遵循Martijn Pieters 在“当值是 cls 实例时可以注释返回类型吗?”中的帖子的方法。对于@classmethod工厂,但将它们应用于Enum @classmethod返回枚举成员之一的 s。

不幸的是,mypy 不喜欢我的 return 语句的类型:

error: Incompatible return value type (got "StringSize", expected "_StringSizeT") …
Run Code Online (Sandbox Code Playgroud)

python enums type-hinting mypy

9
推荐指数
0
解决办法
2762
查看次数

带有抽象基类的 Python 类型提示

我有一个 ABC 方法,子类应该返回他们自己的类型,我正在尝试找出最好的方法来提示这个。例如:

from abc import ABC, abstractmethod

class Base(ABC):
    @abstractmethod
    def f(self): ## here i want a type hint for type(self)
        pass

class Blah(Base):
    def __init__(self, x: int):
        self.x = x

    def f(self) -> "Blah":
        return Blah(self.x + 1)
Run Code Online (Sandbox Code Playgroud)

我能想到的最好的是这个,它有点沉重:

from abc import ABC, abstractmethod
from typing import TypeVar, Generic

SELF = TypeVar["SELF"]

class Base(ABC, Generic[SELF]):

    @abstractmethod
    def f(self) -> SELF:
        pass

class Blah(Base["Blah"]):

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

    def f(self) -> "Blah":
        return Blah(self.x+1)
Run Code Online (Sandbox Code Playgroud)

我有更好/更清洁的方法吗?

python abc type-hinting

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

返回类的类方法

我正在玩python的3.5类型提示.我想知道如何键入提示类方法的返回类型.

这就是我的想法:

>>> class A():
    @classmethod
    def a(cls) -> A:
        pass

Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    class A():
  File "<pyshell#24>", line 3, in A
    def a(cls) -> A:
NameError: name 'A' is not defined
Run Code Online (Sandbox Code Playgroud)

显然它不起作用.我想一种方法是做某种"前向声明",如下所示:

>>> class A():
    pass

>>> class A():
    @classmethod
    def a(cls) -> A:
        pass
Run Code Online (Sandbox Code Playgroud)

但这并不觉得"pythonic".人们通常如何解决这个问题?

python type-hinting python-3.5

4
推荐指数
1
解决办法
1076
查看次数

标签 统计

python ×5

type-hinting ×4

class ×2

abc ×1

enums ×1

mypy ×1

oop ×1

python-3.5 ×1