【问题标题】:How can I set a default value for an enum attribute of a recordclass dataobject?如何为记录类数据对象的枚举属性设置默认值?
【发布时间】:2022-11-06 02:59:52
【问题描述】:

recordclass 数据对象可以很好地处理枚举属性,除非您需要设置默认值,这会导致 SyntaxError(从版本 0.17.5 开始):


In [1]: from enum import Enum, auto

In [2]: from recordclass import dataobject

In [3]: class Color(Enum):
   ...:     RED = auto()
   ...: 

In [4]: class Point(dataobject):
   ...:     x: float
   ...:     y: float
   ...:     color: Color
   ...: 

In [5]: pt = Point(1, 2, Color.RED)

In [6]: pt
Out[6]: Point(x=1, y=2, color=<Color.RED: 1>)

In [7]: class Point(dataobject):
   ...:     x: float
   ...:     y: float
   ...:     color: Color = Color.RED
   ...: 
   ...: 
Traceback (most recent call last):
...
  File "<string>", line 2
    def __new__(_cls_, x, y, color=<Color.RED: 1>):
                                   ^
SyntaxError: invalid syntax

这个问题有解决方法吗?

【问题讨论】:

  • &lt;Color.RED: 1&gt; 不是有效的 Python 语法。我想你想要Color.RED。这实际上与默认参数无关。

标签: python enums recordclass


【解决方案1】:

假设问题中的示例是准确的,您需要覆盖标准和Enum.__repr__():

class Color(Enum):
    #
    def __repr__(self):
        return f'{self.__class__.__name__}.{self._name_}'
    #
    RED = auto()

【讨论】:

    【解决方案2】:

    由于 0.18 可以使用任何类型的默认值。

    from recordclass import dataobject
    from enum import Enum, auto
    
    class Color(Enum):
        RED = auto()
    
    class Point(dataobject):
        x: float
        y: float
        color: Color = Color.RED
    
    >>> pt = Point(1,2)
    >>> pt
    Point(x=1, y=2, color=<Color.RED: 1>)
    >>> pt.color
    <Color.RED: 1>
    >>> type(pt.color)
    <enum 'Color'>
    >>> Point.__new__.__defaults__
    (<Color.RED: 1>,)
    

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2019-11-21
      相关资源
      最近更新 更多