Mik*_*ovy 4 python exec python-2.7
I'm trying to declare two functions within exec statement in python. Let's call them f1() and f2().
I've found out that when exec is invoked inside of some function, then f2() has no visibility of f1(). However this doesn't happen when exec and function call are placed in global code.
# Case 1: Working fine
code = """
def f1(): print "bar"
def f2(): f1()
"""
exec(code)
f2() # Prints "bar" as expected
Run Code Online (Sandbox Code Playgroud)
# Case 2: Throws NameError: global name 'f1' is not defined
code = """
def f1(): print "bar"
def f2(): f1()
"""
def foo():
exec(code)
f2() # NameError
foo()
Run Code Online (Sandbox Code Playgroud)
Can someone explain me how to avoid that NameError and make exec work inside of a function?
exec()接受的第二个参数globals。如文档中所述:
注意内置函数globals()和locals()分别返回当前的全局字典和局部字典,这对于传递给exec()的第二个和第三个参数可能很有用。
因此,您可以通过显式传递以下内容来完成这项工作globals():
code = """
def f1(): print ("bar")
def f2(): f1()
"""
def foo():
exec(code, globals())
f2() # works in python2.7 and python3
foo()
Run Code Online (Sandbox Code Playgroud)
如果您想精确地控制范围,可以将一个对象传递给exec:
code = """
def f1(): print ("bar")
def f2(): f1()
"""
def foo():
context = {}
exec(code, context)
context['f2']()
foo()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |