Python 调用在另一个函数中定义的函数
我可以从python3.2中的全局范围调用嵌套在另一个函数中的函数吗Python 调用在另一个函数中定义的函数,python,python-3.x,Python,Python 3.x,我可以从python3.2中的全局范围调用嵌套在另一个函数中的函数吗 def func1(): def func2(): print("Hello") return return 有没有从func1()外部调用func2()的方法?没有,除非返回函数: def func1(): def func2(): print("Hello") return func2 innerfunc = func1() innerfu
def func1():
def func2():
print("Hello")
return
return
有没有从func1()外部调用func2()的方法?没有,除非返回函数:
def func1():
def func2():
print("Hello")
return func2
innerfunc = func1()
innerfunc()
甚至
func1()()
您希望使用解决方案,但从理论上讲,您可以将自己切割成本地可访问的
func1
的代码对象,并切掉func2
的代码对象,然后执行以下操作:
#!/usr/bin/env python
def func1():
def func2():
print("Hello")
# => co_consts is a tuple containing the literals used by the bytecode
print(func1.__code__.co_consts)
# => (None, <code object func2 at 0x100430c60, file "/tmp/8457669.py", line 4>)
exec(func1.__code__.co_consts[1])
# => prints 'Hello'
#/usr/bin/env python
def func1():
def func2():
打印(“你好”)
#=>co_consts是一个元组,包含字节码使用的文本
打印(功能1.\u代码\u.co\u常量)
#=>(无,<0x100430c60处的代码对象func2,文件“/tmp/8457669.py”,第4行>)
exec(函数1.\u代码\u.co\u常量[1])
#=>打印“你好”
但同样地,这对于生产代码来说并不是什么
注意:对于Python2版本,将\uuuuuu code\uuuu
替换为func\u code
(并从\uuuu future\uuuu
导入打印函数)
进一步阅读:
结果
Hello
Hello
True
False
Hello
True
Hello
此外:
结果
Hello
Hello
True
False
Hello
True
Hello
感兴趣的是什么?这是基于eyquem的解决方案
def func1():
global func2 # put it in global scope
def func2():
print("Hello")
现在可以直接调用func2
但是必须先调用func1(),然后才能调用func2(),否则它还没有定义。只有在先调用func1()
时,才生成func2()
对象。为了解耦这些紧密绑定的def
语句,我建议始终单独定义每个函数,然后调用func1()
作为func2()
@Sam的包装器eyquem的答案有效。它可能不优雅或不推荐,但如果你知道你在做什么,你可以使用它。比使用dunder属性/方法等+1来表现纯粹的疯狂和大胆要好得多。虽然不适合您必须维护的代码,但了解引擎盖下发生的事情是很好的(例如,函数与字节码解耦,字节码可以单独执行)。@delnan“了解引擎盖下发生的事情很好”是的!我认为您的答案被否决的原因是您输入了大量代码,几乎没有解释,而且因为您的代码有点像黑客,而且使用函数式编程技术有很多困难。@Kazark谢谢。我没有意识到这种缺乏解释的印象。相反,我认为读者对如此容易理解的代码没有明显的评论可能会更轻松在我看来,“黑客”这个词对我的代码来说太过分了——我没有试图给出比其他人更好的答案,我展示了其他可能给OP带来更多想法和理解的方法;我应该解释一下。您的代码在定义时调用内部函数,这在规范中是不需要的。此外,使用global
关键字可能会导致一些人不喜欢它。这个解决方案对我很有效。它不应该被否决。另外,它应该是正确的答案,目前是“不,你不能那样做”。@KeithPinson:在我的情况下,我不能返回内部函数,因为它(外部函数)已经返回了一些东西。因此,这不是一个好的解决方案。eyquem的解决方案非常适合我的需要。