Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:不使用硬编码值关联标签、常量名称和整数_Python_Enums - Fatal编程技术网

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
    

看起来你是在要求。但这需要Python3.4+。2.7 stdlib中没有同等版本。您可以安装PyPI的后端口,或者安装无数个第三方enum库中的任何一个,这些库的特性有所不同,但是您说您只想使用stdlib。这基本上意味着您需要获取其中一个库的代码,将其粘贴到您的项目中,然后(如果需要)编辑它,直到它像那样嵌入而不是安装。查看Enum(2.7中有一个backport标准),但它们只关联整数和常量名称,而忽略了标签。我想知道,很天真,为什么不使用两种不同的数据结构,因为有两种不同类型的数据?我正在考虑一本字典,它将“常量名”链接到一个可读的标签,以及一个“常量名”列表,该列表提供了orderParallel data structures是我书中的一个大写字母:)目前正在查看一个
(值,标签)列表
类中的元组有几个访问方法,但看起来有点笨拙。您可以向枚举常量添加任何内容。例如,
Color.RED.label='Color,其范例约为700nm'
。您甚至可以将标签存储在
\uuuu doc\uuuu
中,以便它们显示在
帮助中,尽管您必须手动执行此操作。(我敢肯定,某些第三方enum库允许您使用docstring语法,但stdlib语法不允许。)