调用在另一个函数中定义的函数

14 投票
4 回答
9328 浏览
提问于 2025-04-17 08:06

我可以从全局范围内调用一个嵌套在另一个函数里的函数吗?这是在Python 3.2中。

def func1():
    def func2():
        print("Hello")
        return
    return

有没有办法从func1()外部调用func2()?

4 个回答

0
def func1():
    def func2():
        global fudu
        fudu = func2
        print("Hello")
    func2()


func1()

fudu()

print 'fudu' in dir()
print 'func2' in dir()

结果

Hello
Hello
True
False

还有:

def func1():
    global func2
    def func2():
        print("Hello")
    func2()


func1()

print 'func2' in dir()
func2()

结果

Hello
True
Hello

这有什么意思?

11

想要使用@larsmans'的解决方案,但理论上你可以直接进入本地可访问的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'

不过,再次强调,这不适合用于生产环境

注意:如果你使用的是Python 2版本,把__code__换成func_code(并从__future__中导入print_function)。

一些进一步的阅读资料:

23

不,除非你返回这个函数:

def func1():
    def func2():
        print("Hello")
    return func2

innerfunc = func1()
innerfunc()

或者甚至

func1()()

撰写回答