我正在尝试在Python中创建一个枚举类,但是当你不得不这样做时它会变得很长
VARIABLE1, VARIABLE2, VARIABLE3, VARIABLE3, VARIABLE4, VARIABLE5, VARIABLE6, VARIABLE7, VARIABLE8, ... , VARIABLE14 = range(14)
我尝试将其设置如下,但最终无法正常工作。
VARIABLE1,
VARIABLE2,
VARIABLE3,
...
VARIABLE14 = range(14)
我如何以最简单的方式实现这一目标?
答案 0 :(得分:8)
哦,哇,我只是在变量周围添加了括号,它起作用了
(VARIABLE1,
VARIABLE2,
VARIABLE3,
...
VARIABLE14) = range(14)
答案 1 :(得分:2)
您可以执行以下操作,而不是手动键入VARIABLE1,VARIABLE2:
>>> for x in range(1, 15):
globals()['VARIABLE{0}'.format(x)] = x
你想要什么,没有额外的努力键入VARIABLE1 ... VARIABLE 14。
答案 2 :(得分:2)
使用新的aenum库和Python 3,您可以:
from aenum import Enum
class SomeEnum(Enum, start=0):
VARIABLE1
VARIABLE2
VARIABLE3
VARIABLE4
VARIABLE5
VARIABLE6
VARIABLE7
VARIABLE8
VARIABLE9
VARIABLE10
VARIABLE11
VARIABLE12
VARIABLE13
VARIABLE14
并且在使用中看起来像:
>>> SomeEnum.VARIABLE7
<SomeEnum.VARIABLE7: 6>
注意:aenum
由enum34
答案 3 :(得分:2)
使用namedtuple
类似于namedtuple
的枚举实现。此enum
函数创建一个具有namedtuple
的类,并使用提供的参数实例化该类。参数是字符串,tuple
或list
。 tuple
或list
形式的参数用于为常量提供值,从而重置值序列。默认情况下,常量从零开始计算。
def enum(name, *args):
from collections import namedtuple
kwargs = {}
start = 0
for arg in args:
if isinstance(arg, basestring):
kwargs[arg] = start
start += 1
elif isinstance(arg, (tuple, list)):
if len(arg) != 2:
raise ValueError('"{}" must be a two element tuple or list'.format(arg))
attr, start = arg
if isinstance(attr, basestring):
if isinstance(start, int):
kwargs[attr] = start
start += 1
else:
raise TypeError('second element of "{}" must be of type "int"'.format(arg))
else:
raise TypeError('first element of "{}" must be sub type of "basestring"'.format(arg))
else:
raise TypeError('Argument "{}" must be either sub type of "basestring", "tuple" or "list" of ("basestring", "int")'.format(arg))
if isinstance(name, basestring):
return namedtuple(name, kwargs.keys())(**kwargs)
raise TypeError('Argument "{}" must be an instance of "basestring"'.format(name))
用法;
In [663]: Color = enum('Color', 'black', 'white', 'red')
In [664]: Color.black
Out[664]: 0
In [665]: Color.red
Out[665]: 2
In [666]: #To start from 1
In [667]: Color = enum('Color', ('black',1), 'white', 'red')
In [668]: Color.black
Out[668]: 1
In [669]: Color.red
Out[669]: 3
In [670]: Animal = enum('Animal','cat', 'dog', ['lion',10],'tiger')
In [671]: Animal.dog
Out[671]: 1
In [672]: Animal.tiger
Out[672]: 11
In [673]: Animal.tiger = 12
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-673-8823b3c2482c> in <module>()
----> 1 Animal.tiger = 12
AttributeError: can't set attribute
答案 4 :(得分:1)
行连接的明确方法是使用反斜杠字符:
VARIABLE1,\
VARIABLE2,\
VARIABLE3,\
...
VARIABLE14) = range(14)
,隐含的方法是用括号,方括号或大括号括起来:
[VARIABLE1,
VARIABLE2,
VARIABLE3,
...
VARIABLE14] = range(14)
答案 5 :(得分:1)
通过了解一下范围功能,您可以立即修复它。访问 - documentation了解更多详情。 我们看到2个apis是: 范围(停止) 范围(开始,停止[,步骤])
它只返回该特定范围内的数字列表,其中step默认为1。
因此,您只需要确保您的代码符合您可以通过明确告诉python它们与您可以通过添加&#39; \&#39;每一行末尾的字符。 如果你用&#39; []&#39;或&#39;()&#39;将它们标记为元组列表,python解释器将隐式将其视为一行。使用列出的代码或自己试验以获得更多信息。
答案 6 :(得分:0)
将标识符(变量)构建为'VARIABLE{}'.format(1)
之类的字符串,并生成一个genexp,yield
s 2元素tuple
由标识符和('VARIABLE1', 0)
之类的值组成。
此genexp可用于提供dict
或dict.update
。在OP的情况下,dict
是globals()
返回的那个。
>>> globals().update(('VARIABLE{}'.format(x+1), x) for x in range(14))
>>> VARIABLE1
0
>>> VARIABLE14
13
如果要分配的值是非整数enumerate
,则可以解决变量命名问题。
>>> globals().update(('VARIABLE{}'.format(i), x) for i, x in enumerate('abcdefghijklmn',1))
>>> VARIABLE1
'a'
>>> VARIABLE14
'n'
答案 7 :(得分:0)
我发现词典通常比枚举更合适,因为它们可以轻松地将整数映射到多个变量,函数等。例如,为函数和字符串赋值:
import numpy as np,
CC = [(np.sin, "Taking the sine"),
(np.cos, "Taking the cosine"),
(np.tan, "Taking the tangens")]
dCC = dict(enumerate(CC, start=1)) # built the enumerated dictionary
def calc(n, x):
""" Perform operation on `x` defined by number `n` """
f, s = dCC[n] # map number to function and string
y = f(x)
print(s + " from %g results in %g" % (x, y))
return y
y = calc(2, np.pi) # prints: "Taking the tangens from 3.14159 results in -1"