使用类变量的Python列表理解抛出NameError
我想使用另一个类变量将dict构造为类变量。 这确实在循环中起作用(请参见下面的使用类变量的Python列表理解抛出NameError,python,class,scope,list-comprehension,Python,Class,Scope,List Comprehension,我想使用另一个类变量将dict构造为类变量。 这确实在循环中起作用(请参见下面的order1),但在循环中不起作用(请参见下面的order2)。我收到一条错误消息,提示未定义选项 但是,列表理解确实有效(请参见order3),但这不是我想要的。编辑:事实上,order3也会给出一个错误,但是是在调用时,而不是在定义时,因为它定义的是生成器对象,而不是列表 class Foo(): ALICE = 'TXT42' BOB = 'TXT4711' CHARLIE = 'TXT
order1
),但在循环中不起作用(请参见下面的order2
)。我收到一条错误消息,提示未定义选项
但是,列表理解确实有效(请参见order3
),但这不是我想要的。编辑:事实上,order3
也会给出一个错误,但是是在调用时,而不是在定义时,因为它定义的是生成器对象,而不是列表
class Foo():
ALICE = 'TXT42'
BOB = 'TXT4711'
CHARLIE = 'TXT23'
# List of lists for usage in a Django ChoiceField
choices = (
(ALICE, 'Alice'),
(BOB, 'Bob'),
(CHARLIE, 'Charlie'),
)
# Now I want to define an order for my constants in a dict, with
# order[ALICE] < order[BOB] < order[CHARLIE]
# This works, but is clumsy
order1 = {}
for i in range(len(choices)):
order1[choices[i][0]] = i
# This gives an error (but works if 'choices' is global):
# "NameError: global name 'choices' is not defined"
order2 = { choices[i][0]: i for i in range(len(choices)) }
# This gives a list of dicts, not a dict (but doesn't throw an error)
# My mistake: it gives a generator object. It will throw the same
# error, if you try to access it or make it a list,
# e.g. order3 = list(...)
order3 = ( { choices[i][0]: i } for i in range(len(choices)) )
class Foo():
爱丽丝='TXT42'
BOB='TXT4711'
查理=‘TXT23’
#Django ChoiceField中使用的列表列表
选择=(
(爱丽丝,'爱丽丝'),
(鲍勃,'鲍勃'),
(查理,'查理'),
)
#现在我想为dict中的常量定义一个顺序,使用
#命令[爱丽丝]<命令[鲍勃]<命令[查理]
#这是可行的,但很笨拙
顺序1={}
对于范围内的i(len(选项)):
订单1[choices[i][0]]=i
#这会产生一个错误(但在“选择”是全局的情况下有效):
#“名称错误:未定义全局名称“选项”
order2={choices[i][0]:i代表范围内的i(len(choices))}
#这会给出一个dict列表,而不是dict(但不会抛出错误)
#我的错误:它给出了一个生成器对象。它会扔同样的东西
#错误,如果您试图访问它或将其列为列表,
#例如order3=列表(…)
order3=({choices[i][0]:i}表示范围内的i(len(choices)))
当我在函数定义而不是类中尝试整个代码时,没有错误。当choices
实际上是一个全局变量时,它也起作用,但当它是一个类变量时,它就不起作用了
显然,在类变量的上下文中,列表理解和dict理解的可能性有一点不同。现在我认为这是一个bug,但请给出另一个解释。
试用过的Python版本:Debian GNU/Linux下的2.7.10和3.4.3
编辑:感谢@BrenBarn找到了我没有找到的副本。它解释了我在这里遇到的问题。这不是一个bug,但也不是真正的功能 此词典理解将适合您的需要:
order2 = {choice[0]: idx for idx, choice in enumerate(choices)}