【发布时间】:2021-12-25 06:08:03
【问题描述】:
我正在尝试为使用重载类型装饰器的类创建一个 python 方法。我希望根据传递的 Enum 类型重载该方法。例如,
class GetPortType(enum.Enum):
DIFF_1: "Diff1"
DIFF_2: "Diff2"
SAME_1: "Same1"
SAME_2: "Same2"
class Port:
...
@typing.overload
def get_port_on_type(self, type: GetPortType.DIFF_1, num: int, skip: Optional[List]):
statement1
statement2
return [values]
@typing.overload
def get_port_on_type(self, type: GetPortType.DIFF_2, num: int, skip: Optional[List]):
statement3
statement4
return [values]
@typing.overload
def get_port_on_type(self, type: GetPortType.SAME_1, num: int, skip: Optional[List]):
statement1
statement3
return [values]
@typing.overload
def get_port_on_type(self, type: GetPortType.SAME_2, num: int, skip: Optional[List]):
statement2
statement4
return [values]
我如何实现这一目标?我应该为所有这些情况的枚举和返回类型创建一个“def __ new __(self, value):”方法吗?
编辑:我想知道我们是否可以对 Metaclass 做一些事情,比如返回值类型?哪个可能是这个元类的属性?
@property
def type(self):
return type(self.value)
""" changing the type annotation """
type: GetPortType.SAME_2.type
【问题讨论】:
-
你试过
typing.Literal。例如,最后一个的类型是Literal[GetPortType.SAME_2]。 -
我想你不明白,
typing.overload不会让你实际使用方法重载。它仅用于类型注释。 -
type: GetPortType.DIFF_2那不是类型! -
@FrankYellin 仔细观察,OP 似乎认为您可以根据重载签名拥有 不同的实现。
-
@juanpa.arrivillaga 哎呀。我以为他们只是在问一个打字问题。对不起。
标签: python enums overloading metaclass