How to convert int to Enum in python?

前端 未结 3 1821
独厮守ぢ
独厮守ぢ 2020-12-29 00:31

Using the new Enum feature (via backport enum34) with python 2.7.6.

Given the following definition, how can I convert an int to the corresponding Enum value?

相关标签:
3条回答
  • 2020-12-29 01:25

    You 'call' the Enum class:

    Fruit(5)
    

    to turn 5 into Fruit.Orange:

    >>> from enum import Enum
    >>> class Fruit(Enum):
    ...     Apple = 4
    ...     Orange = 5
    ...     Pear = 6
    ... 
    >>> Fruit(5)
    <Fruit.Orange: 5>
    

    From the Programmatic access to enumeration members and their attributes section of the documentation:

    Sometimes it’s useful to access members in enumerations programmatically (i.e. situations where Color.red won’t do because the exact color is not known at program-writing time). Enum allows such access:

    >>> Color(1)
    <Color.red: 1>
    >>> Color(3)
    <Color.blue: 3>
    

    In a related note: to map a string value containing the name of an enum member, use subscription:

    >>> s = 'Apple'
    >>> Fruit[s]
    <Fruit.Apple: 4>
    
    0 讨论(0)
  • 2020-12-29 01:25

    I think it is in simple words is to convert the int value into Enum by calling EnumType(int_value), after that access the name of the Enum object:

    my_fruit_from_int = Fruit(5) #convert to int
    fruit_name = my_fruit_from_int.name #get the name
    print(fruit_name) #Orange will be printed here
    

    Or as a function:

    def convert_int_to_fruit(int_value):
        try:
            my_fruit_from_int = Fruit(int_value)
            return my_fruit_from_int.name
        except:
            return None
    
    0 讨论(0)
  • 2020-12-29 01:32

    I wanted something similar so that I could access either part of the value pair from a single reference. The vanilla version:

    #!/usr/bin/env python3
    
    
    from enum import IntEnum
    
    
    class EnumDemo(IntEnum):
        ENUM_ZERO       = 0
        ENUM_ONE        = 1
        ENUM_TWO        = 2
        ENUM_THREE      = 3
        ENUM_INVALID    = 4
    
    
    #endclass.
    
    
    print('Passes')
    print('1) %d'%(EnumDemo['ENUM_TWO']))
    print('2) %s'%(EnumDemo['ENUM_TWO']))
    print('3) %s'%(EnumDemo.ENUM_TWO.name))
    print('4) %d'%(EnumDemo.ENUM_TWO))
    print()
    
    
    print('Fails')
    print('1) %d'%(EnumDemo.ENUM_TWOa))
    

    The failure throws an exception as would be expected.

    A more robust version:

    #!/usr/bin/env python3
    
    
    class EnumDemo():
    
    
        enumeration =   (
                            'ENUM_ZERO',    # 0.
                            'ENUM_ONE',     # 1.
                            'ENUM_TWO',     # 2.
                            'ENUM_THREE',   # 3.
                            'ENUM_INVALID'  # 4.
                        )
    
    
        def name(self, val):
            try:
    
                name = self.enumeration[val]
            except IndexError:
    
                # Always return last tuple.
                name = self.enumeration[len(self.enumeration) - 1]
    
            return name
    
    
        def number(self, val):
            try:
    
                index = self.enumeration.index(val)
            except (TypeError, ValueError):
    
                # Always return last tuple.
                index = (len(self.enumeration) - 1)
    
            return index
    
    
    #endclass.
    
    
    print('Passes')
    print('1) %d'%(EnumDemo().number('ENUM_TWO')))
    print('2) %s'%(EnumDemo().number('ENUM_TWO')))
    print('3) %s'%(EnumDemo().name(1)))
    print('4) %s'%(EnumDemo().enumeration[1]))
    print()
    print('Fails')
    print('1) %d'%(EnumDemo().number('ENUM_THREEa')))
    print('2) %s'%(EnumDemo().number('ENUM_THREEa')))
    print('3) %s'%(EnumDemo().name(11)))
    print('4) %s'%(EnumDemo().enumeration[-1]))
    

    When not used correctly this avoids creating an exception and, instead, passes back a fault indication. A more Pythonic way to do this would be to pass back "None" but my particular application uses the text directly.

    0 讨论(0)
提交回复
热议问题