代码之家  ›  专栏  ›  技术社区  ›  xenoid

python:关联没有硬编码值的标签、常量名和整数

  •  1
  • xenoid  · 技术社区  · 7 年前

    我在寻找一种联系的方式:

    • 人类可读的标签: "Option one" 甚至 u'Première option'
    • “常量名称”: OPTION_ONE
    • 整数值(从0到上)

    鉴于:

    • 代码将标签列表传递给一些api,api将其显示给用户
    • api返回一个整数值,这是用户在上面的序列中选择的索引
    • 我想稍后将这个整数值与一个常量名(或从中快速导出的名称)进行比较。
    • 我希望能够轻松地在序列中插入/移除/重新排序标签
    • 我不想硬编码任何整数值(除了 0 作为基本索引(如果需要)。

    当然,这是为了使代码看起来干净,所以需要合理的简洁性。这应该使用标准库在Python2.7中运行。

    1 回复  |  直到 7 年前
        1
  •  1
  •   xenoid    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