gpt4 book ai didi

带有强制关键字参数的自定义类的 Python 枚举

转载 作者:行者123 更新时间:2023-12-03 18:48:02 24 4
gpt4 key购买 nike

我正在尝试使用具有强制性位置参数的自定义类创建枚举。

class Coord:
def __init__(self, *, x, y):
self._x = x
self._y = y
我想用这个类做几个枚举。
类似的东西:
class IntCoord(Coord, Enum):
ONE_ONE = Coord(x=1, y=1)

class FloatCoord(Coord, Enum):
ONE_ONE = Coord(x=0.1, y=0.1)
这样我就可以在其他类中使用它们,例如:
class System(Generic[T]):
@classmethod
def get_one_one(cls) -> T:
return NotImplemented

class IntSystem(System[IntCoord]):
@classmethod
def get_one_one(cls) -> IntCoord:
return IntCoord.ONE_ONE

class FloatSystem(System[FloatCoord]):
@classmethod
def get_one_one(cls) -> FloatCoord:
return FloatCoord.ONE_ONE
之后,我想比较枚举:
IntCoord(x=1, y=1) is IntSystem.get_one_one()
我很难定义 Coord类(class)。
似乎无法实例化 Coord枚举类 Coord(x=1, y=1)有没有用枚举实现这一目标的好方法?
还是更好的合理实现?
完整脚本如下:
from enum import Enum
from typing import Generic, TypeVar


class Coord:
def __init__(self, *, x, y):
self._x = x
self._y = y


class IntCoord(Coord, Enum):
ONE_ONE = Coord(x=1, y=1)


class FloatCoord(Coord, Enum):
ONE_ONE = Coord(x=0.1, y=0.1)


T = TypeVar('T', bound=Coord)


class System(Generic[T]):
@classmethod
def get_one_one(cls) -> T:
return NotImplemented


class IntSystem(System[IntCoord]):
@classmethod
def get_one_one(cls) -> IntCoord:
return IntCoord.ONE_ONE


class FloatSystem(System[FloatCoord]):
@classmethod
def get_one_one(cls) -> FloatCoord:
return FloatCoord.ONE_ONE


if __name__ == '__main__':
int_one_one = IntSystem.get_one_one()
float_one_one = FloatSystem.get_one_one()

print(IntCoord(x=1, y=1) is int_one_one)
print(FloatCoord(x=0.1, y=0.1) is float_one_one)

错误是:
Traceback (most recent call last):
File "test.py", line 11, in <module>
class IntCoord(Coord, Enum):
File ".pyenv/versions/3.9.0/lib/python3.9/enum.py", line 228, in __new__
enum_member.__init__(*args)
TypeError: __init__() takes 1 positional argument but 2 were given

最佳答案

您遇到的问题 CoordEnum是你说你的枚举也是 Coord , 和 Coord需要两个参数——但你只给你的枚举成员 ONE_ONE单个参数... a Coord .
有两种方法可以解决这个问题:

  • 不要使用 Coord在您的枚举成员中(并丢失关键字(非位置)参数):
  •     class Coord:
    def __init__(self, x, y):
    self._x = x
    self._y = y

    class IntCoord(Coord, Enum):

    ONE_ONE = 1, 1
  • 不要使用 Coord在您的枚举标题中(并保留您的关键字参数,但添加 property s 以便 blah._xblah._y 仍然有效]:
  •     class Coord:
    def __init__(self, *, x, y):
    self._x = x
    self._y = y

    class IntCoord(Enum):
    #
    ONE_ONE = Coord(x=1, y=1)
    #
    @property
    def _x(self):
    return self.value._x
    #
    @property
    def _y(self):
    return self.value._y

    如果您使用 aenum 确实会变得更容易1 个库代替:
    from aenum import Enum, enum

    class Coord:
    def __init__(self, *, x, y):
    self._x = x
    self._y = y

    class IntCoord(Coord, Enum):
    #
    ONE_ONE = enum(x=1, y=1)
    并在使用中:
    >>> IntCoord.ONE_ONE
    <IntCoord.ONE_ONE: enum(x=1, y=1)>

    >>> IntCoord.ONE_ONE._y
    1
    请注意,在上述所有情况下,检索 IntCoord.ONE_ONE按值比平时有点棘手:
  • IntCoord((1, 1))
  • IntCoord(Coord(x=1, y=1))
  • IntCoord(enum(x=1, y=1))

  • ——
    1 披露:我是 Python stdlib Enum 的作者, enum34 backport ,以及 Advanced Enumeration ( aenum )图书馆。

    关于带有强制关键字参数的自定义类的 Python 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67412377/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com