首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从全局环境中的函数内部使用exec定义函数

从全局环境中的函数内部使用exec定义函数
EN

Stack Overflow用户
提问于 2015-04-23 01:56:59
回答 2查看 2.9K关注 0票数 3

我有一个函数,当被调用时,应该使用exec定义另一个函数,并使这个新函数可用于主程序。我们的目标如下。

主程序:

代码语言:javascript
复制
#!/usr/bin/python
from ext import makeF

makeF()
sayA()

外部模块:

代码语言:javascript
复制
def makeF():
    script="def sayA():\n\tprint 'Aah'"
    exec(script)
    sayA()
    return

我想要的是能够从主程序调用内部函数sayA(),因此在这个示例中,输出应该是

代码语言:javascript
复制
Aah
Aah

但它却回来了

代码语言:javascript
复制
Aah
Traceback (most recent call last):
  File "mwe.py", line 5, in <module>
    sayA()
NameError: name 'sayA' is not defined

这是我所期望的,所以我用exec(script,globals)代替了exec(script,globals),根据文档,但是我得到

代码语言:javascript
复制
Traceback (most recent call last):
  File "mwe.py", line 4, in <module>
    makeF()
  File "/home/tomas/tests/ext.py", line 3, in makeF
    exec(script,globals,locals)
TypeError: exec: arg 2 must be a dictionary or None

我觉得我漏掉了一些很明显的东西,但我搞不懂。任何帮助都是非常感谢的。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-23 02:06:49

您已经在makeF中创建了函数,因此它在函数外部的外部模块的作用域中都是不可见的。

如果您想从main调用它,return sayA

代码语言:javascript
复制
def makeF():
    script="def sayA():\n\tprint('Aah')"
    exec(script)
    return sayA

然后主要是:

代码语言:javascript
复制
f = makeF()
f()

要在python3中获得相同的行为,其中exec不再是语句而是函数,可以使用带有dict的lambda:

代码语言:javascript
复制
def makeF():
    d = {}
    "sayA = lambda: print('Aah')"
    exec("sayA = lambda: print('Aah')",d)
    return d["sayA"]

from ext import makeF

f = makeF()
f()
票数 4
EN

Stack Overflow用户

发布于 2015-04-23 02:12:40

全局和局部变量()是函数,而不是字典(尽管它们返回字典)。

而且,您试图调用它的方式是,sayA是在局部变量()中定义的。别管那个了。

我的版本:

代码语言:javascript
复制
def makeF():
  script="def sayA():\n\tprint 'Aah'"
  #exec script in globals()
  exec(script, globals())
  #exec(script, globals(), locals())
  sayA()
  print globals()
  print locals()

makeF()
sayA()

试着用注释的行来对比。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29812241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档