30

我可以将导入语句放在一个字符串中,执行它,它可以工作(打印一个随机数字):

code = """
import random
def f():
    print random.randint(0,9)
"""

def f():
    pass

exec code
f()

现在,如果我将exec codeandf()放入他们自己的函数中并调用它,它就不起作用了。

def test():
    exec code
    f()

test()

它说NameError: global name 'random' is not defined

4

3 回答 3

26

这个怎么样:

def test():
    exec (code, globals())
    f()
于 2012-09-20T01:48:51.787 回答
20

这里发生的事情是模块 random 被导入为测试中的局部变量。试试这个

def test():
    exec code
    print globals()
    print locals()
    f()

将打印

{'code': '\nimport random\ndef f():\n    print random.randint(0,9)\n', '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x02958BF0>, '__name__': '__main__', '__doc__': None}
{'random': <module 'random' from 'C:\Python27\lib\random.pyc'>, 'f': <function f at 0x0295A070>}

f看不到的原因random是它f不是 --if 内部的嵌套函数test

def test():
    import random
    def f():
        print random.randint(0,9)
    f()

它会起作用的。但是,嵌套函数要求在编译外部函数时,外部函数包含内部函数的定义——这是因为您需要设置单元变量来保存两个(外部和内部)函数之间共享的变量。

要随机进入全局命名空间,您只需执行以下操作

exec code in globals(),globals()

关键字后面的 exec 参数in是执行代码的全局和局部命名空间(因此,在 exec'd 代码中定义的名称被存储在其中)。

于 2012-09-20T01:54:10.733 回答
7

指定你想要全局random模块

code = """
import random
def f():
  global random
  print random.randint(0,9)
"""

这里的问题是将random模块导入函数范围,而不是全局范围。

于 2012-09-20T01:39:37.223 回答