Python生成器表达式中的变量范围

时间:2014-05-29 19:00:04

标签: python python-2.7 scope generator

我编写了一个创建字典映射字符串的函数 - >发电机表达。生成器表达式根据两个条件过滤项目列表,这两个条件对于字典中的每个生成器都是不同的。

def iters(types):
    iterators = {}
    for tname in types:
        inst, type = tname.split('|')
        iterators[tname] = (t for t in transactions() if t['institution_type'] == inst and t['type'] == type)
    return iterators

我遇到的问题是所有的生成器都是根据insttype的最后一个值进行过滤的,大概是因为这两个变量在每次迭代中被重复使用循环。我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:4)

是的,insttype名称用作闭包;当你迭代生成器时,它们被绑定到循环中的最后一个值。

为名称创建新范围;一个函数可以做到这一点:

def iters(types):
    def build_gen(tname):
        inst, type = tname.split('|')
        return (t for t in transactions()
                if t['institution_type'] == inst and t['type'] == type)
    iterators = {}
    for tname in types:
        iterators[tname] = build_gen(tname)
    return iterators

你也可以用dict理解来替换最后一行:

def iters(types):
    def build_gen(tname):
        inst, type = tname.split('|')
        return (t for t in transactions() 
                if t['institution_type'] == inst and t['type'] == type)
    return {tname: build_gen(tname) for tname in types}