def中的Python eval传入了func:map okay但是list comprehension在命名空间上失败了

时间:2017-04-05 17:02:27

标签: python namespaces eval

我试图掌握python名称空间的细微差别。当封闭的func传递给包含eval的函数时,为什么eval()在列表comp上会失败?所有这些run2x版本都可以工作,除了最后一个run2g。

def sub2(var2):
    var2 += 1
    return var2

def run2c():  # This works by retrieving sub2 from globals
    print('comp', eval('[sub2(n) for n in (1,2,3)]'))

def run2h(func):  # Partial fix but cannot access globals in eval()
    print('arg comp', eval('[func(n) for n in (1,2,3)]', locals())) 


def run2h(func):  # Fails again on func
    print('arg comp', eval('[func(n) for n in (1,2,3)]', globals(), locals()))

def run2g(func):  # This fails to use func in locals
    print('arg comp', eval('[func(n) for n in (1,2,3)]'))  # NameError: name 'func' is not defined




def run2a():
    print('base', eval('sub2(1)'))

def run2b():
    print('map', list(eval('map(sub2, (1,2,3))')))

def run2c_():
    print('comp', eval('[sub2(n) for n in (1,2,3)]'))

def run2d(func):
    print('arg', eval('func(1)'))

def run2e(func):
    print('arg map', list(eval('map(func, (1,2,3))')))

def run2f(func):
    print('arg plain', [func(n) for n in (1,2,3)])

def run2g_(func):
    print('arg comp', eval('[func(n) for n in (1,2,3)]'))  # NameError: name 'func' is not defined



if __name__ == "__main__":
    run2a()
    run2b()
    run2c()
    run2d(sub2)
    run2e(sub2)
    run2f(sub2)
    run2g(sub2)

Python 3.6

0 个答案:

没有答案