python工具库介绍-enum: 枚举

作者: python测试开发 | 来源:发表于2018-10-08 23:35 被阅读78次

    简介

    枚举是常量的集合,支持根据id比较和迭代等功能。

    创建枚举

    继承Enum类,添加类属性即可创建枚举。

    enum_create.py

    #!python
    
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # Author Rongzhong Xu 2016-08-22 wechat: pythontesting
    """
    Name: enum_create.py
    Tesed in python3.5
    
    The members are produced in the order they are declared in the class
    definition. The names and values are not used to sort them in any way.
    """
    import enum
    
    
    class BugStatus(enum.Enum):
    
        new = 7
        incomplete = 6
        invalid = 5
        wont_fix = 4
        in_progress = 3
        fix_committed = 2
        fix_released = 1
    
    
    print('\nMember name: {}'.format(BugStatus.wont_fix.name))
    print('Member value: {}'.format(BugStatus.wont_fix.value))
    print()
    
    # Iteration
    for status in BugStatus:
        print('{:15} = {}'.format(status.name, status.value))
    
    
    # Comparing Enums
    # Because enumeration members are not ordered,
    # they only support comparison by identity and equality.
    actual_state = BugStatus.wont_fix
    desired_state = BugStatus.fix_released
    
    print('Equal   :',
          actual_state == desired_state,
          actual_state == BugStatus.wont_fix)
    print('Identity:',
          actual_state is desired_state,
          actual_state is BugStatus.wont_fix)
    print('Ordered by value:')
    try:
        print('\n'.join('  ' + s.name for s in sorted(BugStatus)))
    except TypeError as err:
        print('  Cannot sort: {}'.format(err))
    
    

    执行结果

    #!python
    
    $ python3 enum_create.py 
    
    Member name: wont_fix
    Member value: 4
    
    new             = 7
    incomplete      = 6
    invalid         = 5
    wont_fix        = 4
    in_progress     = 3
    fix_committed   = 2
    fix_released    = 1
    Equal   : False True
    Identity: False True
    Ordered by value:
      Cannot sort: unorderable types: BugStatus() < BugStatus()
    
    

    可见每个枚举成员都有name和value,顺序和创建顺序一致,但不用它们进行排序,枚举成员之间不能进行比较。

    IntEnum类可以基于value进行比较:

    enum_intenum.py

    #!python
    
    import enum
    
    
    class BugStatus(enum.IntEnum):
    
        new = 7
        incomplete = 6
        invalid = 5
        wont_fix = 4
        in_progress = 3
        fix_committed = 2
        fix_released = 1
    
    
    print('Ordered by value:')
    print('\n'.join('  ' + s.name for s in sorted(BugStatus)))
    

    执行结果:

    #!python
    
    $ python3 enum_intenum.py
    Ordered by value:
      fix_released
      fix_committed
      in_progress
      wont_fix
      invalid
      incomplete
      new
    
    

    唯一性

    默认后面出现的重复值为别名:

    enum_aliases.py

    #!python
    import enum
    
    
    class BugStatus(enum.Enum):
    
        new = 7
        incomplete = 6
        invalid = 5
        wont_fix = 4
        in_progress = 3
        fix_committed = 2
        fix_released = 1
    
        by_design = 4
        closed = 1
    
    
    for status in BugStatus:
        print('{:15} = {}'.format(status.name, status.value))
    
    print('\nSame: by_design is wont_fix: ',
          BugStatus.by_design is BugStatus.wont_fix)
    print('Same: closed is fix_released: ',
          BugStatus.closed is BugStatus.fix_released)
    
    
    

    执行结果

    #!python
    
    $ python3 enum_aliases.py 
    new             = 7
    incomplete      = 6
    invalid         = 5
    wont_fix        = 4
    in_progress     = 3
    fix_committed   = 2
    fix_released    = 1
    
    Same: by_design is wont_fix:  True
    Same: closed is fix_released:  True
    
    

    通过装饰符@enum.unique可以保证唯一性

    enum_unique_enforce.py

    #!python
    
    import enum
    
    
    @enum.unique
    class BugStatus(enum.Enum):
    
        new = 7
        incomplete = 6
        invalid = 5
        wont_fix = 4
        in_progress = 3
        fix_committed = 2
        fix_released = 1
    
        # This will trigger an error with unique applied.
        by_design = 4
        closed = 1
    
    

    执行结果

    #!python
    
    $ python3 enum_unique_enforce.py 
    Traceback (most recent call last):
      File "enum_unique_enforce.py", line 16, in <module>
        class BugStatus(enum.Enum):
      File "/usr/lib/python3.5/enum.py", line 573, in unique
        (enumeration, alias_details))
    ValueError: duplicate values found in <enum 'BugStatus'>: by_design -> wont_fix, closed -> fix_released
    
    

    构造方法创建枚举

    enum_programmatic_create.py

    #!python
    
    import enum
    
    
    BugStatus = enum.Enum(
        value='BugStatus',
        names=('fix_released fix_committed in_progress '
               'wont_fix invalid incomplete new'),
    )
    
    print('Member: {}'.format(BugStatus.new))
    
    print('\nAll members:')
    for status in BugStatus:
        print('{:15} = {}'.format(status.name, status.value))
    

    执行结果:

    #!python
    
    $ python3 enum_programmatic_create.py
    
    Member: BugStatus.new
    
    All members:
    fix_released    = 1
    fix_committed   = 2
    in_progress     = 3
    wont_fix        = 4
    invalid         = 5
    incomplete      = 6
    new             = 7
    
    

    构造函数自动生成的value从0开始。还可以从元组或者字典构成的列表等生成。

    enum_programmatic_mapping.py

    #!python
    
    import enum
    
    
    BugStatus = enum.Enum(
        value='BugStatus',
        names=[
            ('new', 7),
            ('incomplete', 6),
            ('invalid', 5),
            ('wont_fix', 4),
            ('in_progress', 3),
            ('fix_committed', 2),
            ('fix_released', 1),
        ],
    )
    
    print('All members:')
    for status in BugStatus:
        print('{:15} = {}'.format(status.name, status.value))
    

    执行结果

    #!python
    
     python3 enum_programmatic_mapping.py
    All members:
    new             = 7
    incomplete      = 6
    invalid         = 5
    wont_fix        = 4
    in_progress     = 3
    fix_committed   = 2
    fix_released    = 1
    
    

    非整型的value

    enum_complex_values.py

    #!python
    
    import enum
    
    
    class BugStatus(enum.Enum):
    
        new = {
            'value': 7,
            'transitions': ['incomplete', 'invalid', 'wont_fix', 'in_progress', ],
        }## 简介
    
    枚举是常量的集合,支持根据id比较和迭代等功能。
    
    参考资料:
    ----------------------------------------------
    
    * python中文库参考项目:  https://bitbucket.org/china-testing/python-chinese-library
    
    * python中文库参考项目文档:https://bitbucket.org/china-testing/python-chinese-library/wiki/browse/
    
    * 技术支持 钉钉群:21745728(可以加钉钉pythontesting邀请加入) qq群:144081101 591302926  567351477
    
    * 道家技术-手相手诊看相中医等钉钉群21734177 qq群:391441566 184175668 338228106 看手相、面相、舌相、抽签、体质识别。服务费50元每人次起。请联系钉钉或者微信pythontesting
    
    [接口自动化性能测试数据分析人工智能从业专家一对一线上培训大纲](https://china-testing.github.io/testing_training.html)
    
    
    * 相关文档下载地址:https://bitbucket.org/china-testing/python-chinese-library/downloads
    
    * python官方文档:https://docs.python.org/3/library/enum.html
    
    * pymotw文档:https://pymotw.com/3/enum/index.html
    
    * 完稿日期:2016.08.22
    
    ## 创建枚举
    
    继承Enum类,添加类属性即可创建枚举。
    
    enum_create.py
    
    
    

    !python

    !/usr/bin/env python

    -- coding: utf-8 --

    Author Rongzhong Xu 2016-08-22 wechat: pythontesting

    """
    Name: enum_create.py
    Tesed in python3.5

    The members are produced in the order they are declared in the class
    definition. The names and values are not used to sort them in any way.
    """
    import enum

    class BugStatus(enum.Enum):

    new = 7
    incomplete = 6
    invalid = 5
    wont_fix = 4
    in_progress = 3
    fix_committed = 2
    fix_released = 1
    

    print('\nMember name: {}'.format(BugStatus.wont_fix.name))
    print('Member value: {}'.format(BugStatus.wont_fix.value))
    print()

    Iteration

    for status in BugStatus:
    print('{:15} = {}'.format(status.name, status.value))

    Comparing Enums

    Because enumeration members are not ordered,

    they only support comparison by identity and equality.

    actual_state = BugStatus.wont_fix
    desired_state = BugStatus.fix_released

    print('Equal :',
    actual_state == desired_state,
    actual_state == BugStatus.wont_fix)
    print('Identity:',
    actual_state is desired_state,
    actual_state is BugStatus.wont_fix)
    print('Ordered by value:')
    try:
    print('\n'.join(' ' + s.name for s in sorted(BugStatus)))
    except TypeError as err:
    print(' Cannot sort: {}'.format(err))

    
    执行结果
    
    
    

    !python

    $ python3 enum_create.py

    Member name: wont_fix
    Member value: 4

    new = 7
    incomplete = 6
    invalid = 5
    wont_fix = 4
    in_progress = 3
    fix_committed = 2
    fix_released = 1
    Equal : False True
    Identity: False True
    Ordered by value:
    Cannot sort: unorderable types: BugStatus() < BugStatus()

    
    可见每个枚举成员都有name和value,顺序和创建顺序一致,但不用它们进行排序,枚举成员之间不能进行比较。
    
    IntEnum类可以基于value进行比较:
    
    enum_intenum.py
    
    
    

    !python

    import enum

    class BugStatus(enum.IntEnum):

    new = 7
    incomplete = 6
    invalid = 5
    wont_fix = 4
    in_progress = 3
    fix_committed = 2
    fix_released = 1
    

    print('Ordered by value:')
    print('\n'.join(' ' + s.name for s in sorted(BugStatus)))

    
    
    执行结果:
    
    

    !python

    $ python3 enum_intenum.py
    Ordered by value:
    fix_released
    fix_committed
    in_progress
    wont_fix
    invalid
    incomplete
    new

    ## 唯一性
    
    默认后面出现的重复值为别名:
    
    enum_aliases.py
    
    

    !python

    import enum

    class BugStatus(enum.Enum):

    new = 7
    incomplete = 6
    invalid = 5
    wont_fix = 4
    in_progress = 3
    fix_committed = 2
    fix_released = 1
    
    by_design = 4
    closed = 1
    

    for status in BugStatus:
    print('{:15} = {}'.format(status.name, status.value))

    print('\nSame: by_design is wont_fix: ',
    BugStatus.by_design is BugStatus.wont_fix)
    print('Same: closed is fix_released: ',
    BugStatus.closed is BugStatus.fix_released)

    
    执行结果
    
    
    

    !python

    $ python3 enum_aliases.py
    new = 7
    incomplete = 6
    invalid = 5
    wont_fix = 4
    in_progress = 3
    fix_committed = 2
    fix_released = 1

    Same: by_design is wont_fix: True
    Same: closed is fix_released: True

    
    通过装饰符@enum.unique可以保证唯一性
    
    enum_unique_enforce.py
    
    
    

    !python

    import enum

    @enum.unique
    class BugStatus(enum.Enum):

    new = 7
    incomplete = 6
    invalid = 5
    wont_fix = 4
    in_progress = 3
    fix_committed = 2
    fix_released = 1
    
    # This will trigger an error with unique applied.
    by_design = 4
    closed = 1
    
    
    执行结果
    
    
    

    !python

    $ python3 enum_unique_enforce.py
    Traceback (most recent call last):
    File "enum_unique_enforce.py", line 16, in <module>
    class BugStatus(enum.Enum):
    File "/usr/lib/python3.5/enum.py", line 573, in unique
    (enumeration, alias_details))
    ValueError: duplicate values found in <enum 'BugStatus'>: by_design -> wont_fix, closed -> fix_released

    
    ## 构造方法创建枚举
    
    enum_programmatic_create.py
    
    
    

    !python

    import enum

    BugStatus = enum.Enum(
    value='BugStatus',
    names=('fix_released fix_committed in_progress '
    'wont_fix invalid incomplete new'),
    )

    print('Member: {}'.format(BugStatus.new))

    print('\nAll members:')
    for status in BugStatus:
    print('{:15} = {}'.format(status.name, status.value))

    
    执行结果:
    
    

    !python

    $ python3 enum_programmatic_create.py

    Member: BugStatus.new

    All members:
    fix_released = 1
    fix_committed = 2
    in_progress = 3
    wont_fix = 4
    invalid = 5
    incomplete = 6
    new = 7

    
    构造函数自动生成的value从0开始。还可以从元组或者字典构成的列表等生成。
    
    enum_programmatic_mapping.py
    
    
    

    !python

    import enum

    BugStatus = enum.Enum(
    value='BugStatus',
    names=[
    ('new', 7),
    ('incomplete', 6),
    ('invalid', 5),
    ('wont_fix', 4),
    ('in_progress', 3),
    ('fix_committed', 2),
    ('fix_released', 1),
    ],
    )

    print('All members:')
    for status in BugStatus:
    print('{:15} = {}'.format(status.name, status.value))

    
    执行结果
    
    
    

    !python

    python3 enum_programmatic_mapping.py
    All members:
    new = 7
    incomplete = 6
    invalid = 5
    wont_fix = 4
    in_progress = 3
    fix_committed = 2
    fix_released = 1

    
    ## 非整型的value
    
    enum_complex_values.py
    
    
    

    !python

    import enum

    class BugStatus(enum.Enum):

    new = {
        'value': 7,
        'transitions': ['incomplete', 'invalid', 'wont_fix', 'in_progress', ],
    }
    incomplete = {
        'value': 6,
        'transitions': ['new', 'wont_fix'],
    }
    invalid = {
        'value': 5,
        'transitions': ['new'],
    }
    wont_fix = {
        'value': 4,
        'transitions': ['new'],
    }
    in_progress = {
        'value': 3,
        'transitions': ['new', 'fix_committed'],
    }
    fix_committed = {
        'value': 2,
        'transitions': ['in_progress', 'fix_released'],
    }
    fix_released = {
        'value': 1,
        'transitions': ['new'],
    }
    
    def __init__(self, vals):
        self.num = vals['value']
        self.transitions = vals['transitions']
    
    def can_transition(self, new_state):
        return new_state.name in self.transitions
    

    print('Name:', BugStatus.in_progress)
    print('Value:', BugStatus.in_progress.value)
    print('Custom attribute:', BugStatus.in_progress.transitions)
    print('Using attribute:',
    BugStatus.in_progress.can_transition(BugStatus.new))

    
    执行结果
    
    
    

    !python

    python3 enum_complex_values.py
    Name: BugStatus.in_progress
    Value: {'transitions': ['new', 'fix_committed'], 'value': 3}
    Custom attribute: ['new', 'fix_committed']
    Using attribute: True

    
    
    
        incomplete = {
            'value': 6,
            'transitions': ['new', 'wont_fix'],
        }
        invalid = {
            'value': 5,
            'transitions': ['new'],
        }
        wont_fix = {
            'value': 4,
            'transitions': ['new'],
        }
        in_progress = {
            'value': 3,
            'transitions': ['new', 'fix_committed'],
        }
        fix_committed = {
            'value': 2,
            'transitions': ['in_progress', 'fix_released'],
        }
        fix_released = {
            'value': 1,
            'transitions': ['new'],
        }
    
        def __init__(self, vals):
            self.num = vals['value']
            self.transitions = vals['transitions']
    
        def can_transition(self, new_state):
            return new_state.name in self.transitions
    
    
    print('Name:', BugStatus.in_progress)
    print('Value:', BugStatus.in_progress.value)
    print('Custom attribute:', BugStatus.in_progress.transitions)
    print('Using attribute:',
          BugStatus.in_progress.can_transition(BugStatus.new))
    

    执行结果

    #!python
    
     python3 enum_complex_values.py
    Name: BugStatus.in_progress
    Value: {'transitions': ['new', 'fix_committed'], 'value': 3}
    Custom attribute: ['new', 'fix_committed']
    Using attribute: True
    
    

    参考资料

    相关文章

      网友评论

        本文标题:python工具库介绍-enum: 枚举

        本文链接:https://www.haomeiwen.com/subject/cousaftx.html