使用类变量的Python列表理解抛出NameError

使用类变量的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

我想使用另一个类变量将dict构造为类变量。 这确实在循环中起作用(请参见下面的
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)}