setvaltr()与eval()无法按预期工作

时间:2017-10-17 09:09:05

标签: python

这是我想要做的事情:

file_execed.py

#!/usr/bin/env python

def foo():
    return True

def bar():
    return foo()

file_main.py

#!/usr/bin/env python

import module_to_add_to

exec_results = {}
execfile("file_execed.py", globals(), exec_results)

# Attach objects created by exec to module_to_add_to
for k, v in exec_results.iteritems():
    setattr(module_to_add_to, k, v)

module_to_add_to.call()

最后,在module_to_add_to.py

以下作品:

#!/usr/bin/env python

def call():
    eval("foo()", globals(), {})

但不是这一个:

#!/usr/bin/env python

def call():
    eval("bar()", globals(), {})

NameError: global name 'foo' is not defined

为什么foo()直接来自module_to_add_to.py时可以看到bar(),而不是从eval' ed MySqlConnection con = new MySqlConnection("User ID=root;pwd=test123;Initial Catalog=netcom_demo;Data Source=185.106.208....;"); 调用时?{/ p>

1 个答案:

答案 0 :(得分:0)

让我们在file_main.py

中查看您的代码
execfile("file_execed.py", globals(), exec_results)

此行创建两个名为foobar的函数,并将它们放入dict exec_results。当创建这些函数时,它们的全局状态(globals()的结果)是我们放在execfile命令的第二个参数上的,在这种情况下它是全局状态file_main.py(记住当函数在模块中定义,它被设置为该模块的locals(),而不是globals()

# Attach objects created by exec to module_to_add_to
for k, v in exec_results.iteritems():
    setattr(module_to_add_to, k, v)

上面的两个函数foobar已添加到模块module_to_add_to

module_to_add_to.call()

调用上面的函数bar,当它被调用时,如上所述,它的全局状态是全局状态file_main.py,所以让我们检查我们在全局状态{{{ 1}}在file_main.py上方添加以下行:

module_to_add_to.call()

我们得到:

print(globals().keys())

此处没有['exec_results', '__builtins__', '__file__', 'module_to_add_to', '__package__', 'v', '__name__', '__doc__', 'k'] foo,这就是您获得bar例外的原因。

您可以尝试修改代码,如下所示:

NameError

希望这有帮助。