python工具庫介紹-enum: 列舉
簡介
列舉是常量的集合,支援根據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 591302926567351477 * 道家技術-手相手診看相中醫等釘釘群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
參考資料
- 討論qq群144081101 591302926 567351477 釘釘免費群21745728
- ofollow,noindex">本文最新版本地址
- 本文涉及的python測試開發庫 謝謝點贊!
- 本文相關海量書籍下載