Python:不使用硬编码值关联标签、常量名称和整数
我正在寻找一种联系方式:Python:不使用硬编码值关联标签、常量名称和整数,python,enums,Python,Enums,我正在寻找一种联系方式: 人类可读的标签:“选项一”甚至u'Première Option' “常量名称”:选项一 整数值(从0开始) 鉴于: 代码将标签列表传递给某个API,该API将其显示给用户 API返回一个整数值,它是用户在上述序列中选择的索引 我想稍后将这个整数值与其中一个常量名称(或从中快速派生的名称)进行比较 我希望能够在序列中轻松插入/删除/重新排序标签 我不想硬编码任何整数值(除非0作为基本索引,如果需要) 当然,这是为了使代码看起来干净,因此需要合理的简洁性。这应该使
- 人类可读的标签:
甚至“选项一”
u'Première Option'
- “常量名称”:
选项一
- 整数值(从0开始)
- 代码将标签列表传递给某个API,该API将其显示给用户
- API返回一个整数值,它是用户在上述序列中选择的索引
- 我想稍后将这个整数值与其中一个常量名称(或从中快速派生的名称)进行比较
- 我希望能够在序列中轻松插入/删除/重新排序标签
- 我不想硬编码任何整数值(除非
作为基本索引,如果需要)0
当然,这是为了使代码看起来干净,因此需要合理的简洁性。这应该使用标准库在Python 2.7中运行。解决方案使用namedtuple:
- 首先定义一个小函数
from collections import namedtuple def createOpts(name,pairs): # namedtuple('FooType',['OPTION1',...,'OPTIONn','labels'] optsclass=namedtuple(name+'Type',[symbol for symbol,label in pairs]+['labels']) # FooType(0,..,n-1,['Option 1',...,'Option N']) opts=optsclass(*(range(len(pairs))+[[label for symbol,label in pairs]])) return opts
- 选项的定义如下所示
Options=createOpts('Opt',[('OPTION1','Option one'),('OPTION2','Options two'),('OPTION3','Option three'),])
- 然后在代码中,它是这样使用的
print type(Options) print 'Option labels:',Options.labels print 'Option one:',Options.OPTION1 print 'Option two compares to 1:',1==Options.OPTION2 print 'Option 2 in set:', 1 in [Options.OPTION2,Options.OPTION3] print 'Option 1 not in set:', 0 not in [Options.OPTION2,Options.OPTION3] <class '__main__.OptType'> Option labels: ['Option one', 'Options two', 'Option three'] Option one: 0 Option two compares to 1: True Option 2 in set: True Option 1 not in set: True
打印类型(选项) 打印“选项标签:”,Options.labels 打印“选项一:”,Options.OPTION1 打印“选项二比较1:”,1==Options.OPTION2 在[Options.OPTION2,Options.OPTION3]中打印“设置中的选项2:”,1 打印“选项1不在集合中:”,0不在[Options.OPTION2,Options.OPTION3]中 选项标签:[‘选项一’、‘选项二’、‘选项三’] 选项一:0 选项二与选项1相比:正确 集合中的选项2:True 选项1不在集合中:True
(值,标签)列表
类中的元组有几个访问方法,但看起来有点笨拙。您可以向枚举常量添加任何内容。例如,Color.RED.label='Color,其范例约为700nm'
。您甚至可以将标签存储在\uuuu doc\uuuu
中,以便它们显示在帮助中,尽管您必须手动执行此操作。(我敢肯定,某些第三方enum库允许您使用docstring语法,但stdlib语法不允许。)