代码之家  ›  专栏  ›  技术社区  ›  bad_coder Singh

作为枚举成员的保留字

  •  0
  • bad_coder Singh  · 技术社区  · 7 年前

    class Test(Enum):
    
        one = "one"
        is_ = "is"
    

    我想定制 __name__ 返回通常的语法

    >>> print(Test.is_.name)
    is
    

    那么我如何定制呢 __名字__ , __getattribute__ 或 __getattr__ 要做到这一点?

    2 回复  |  直到 7 年前
        1
  •  2
  •   wim    7 年前

    单下划线

    >>> Test.is_._name_ = 'is'                                                                                                                                       
    >>> Test.is_.name                                                                                                                                                
    'is'
    

    >>> list(Test)                                                                                                                                                   
    [<Test.one: 'one'>, <Test.is: 'is'>]
    >>> Test('is')                                                                                                                                                   
    <Test.is: 'is'>
    

    当然,属性访问仍然必须使用声明的名称,否则将是一个语法错误。

    >>> Test.is_._name_ = 'is'                                                                                                                                       
    >>> Test._member_map_['is'] = Test.is_                                                                                                                           
    >>> Test['is']                                                                                                                                                   
    <Test.is: 'is'>
    

    如果您需要的不仅仅是一个简单的别名,那么您可能需要删除原始名称和/或注意保留成员映射中的顺序。

        2
  •  1
  •   Ethan Furman    7 年前

    Functional API 相反:

    Test = Enum('Test', [('one', 'one'), ('is', 'is'), ('is_', 'is')])
    

    在使用中:

    >>> Test.one
    <Test.one: 'one'>
    
    >>> Test.is
      File "<stdin>", line 1
        test.is
              ^
    SyntaxError: invalid syntax
    
    >>> Test.is_
    <Test.is: 'is'>
    
    >>> Test['is']
    <Test.is: 'is'>
    
    >>> Test['is_']
    <Test.is: 'is'>
    
    >>> Test('is')
    <Test.is: 'is'>
    
    >>> list(Test)
    [<Test.one: 'one'>, <Test.is: 'is'>]