如何从Python命令行调用内部函数?

2 投票
1 回答
2224 浏览
提问于 2025-04-16 04:18

我有一些代码(我不太容易修改),它的形式是这样的:

def foo(x):
   do_other_stuff_that_I_do_not_want_to_do()
   def bar():
      "do something"
      str(x)
   bar()

我想直接从Python的命令行中调用 bar() 这个函数。我不介意使用 co_globals 或其他内部的东西。我感觉这可能是不可能的;真的是这样吗?

1 个回答

4

根据你写的代码,想要访问内部函数对象是不可能的——这个对象只有在外部函数运行时(也就是被调用时)才会被创建(是通过def语句创建的)。

顺便提一下,像foo这样的外部函数通常会被编写成在最后一行返回内部函数(例如,把bar()改成return bar),这样做是为了让它们充当“函数工厂”(通常被称为“闭包工厂”),而不是把内部函数的存在当作一种私密的、秘密的实现细节;但你的代码选择了后者。

编辑…:

不过,实际上是可以获取内部函数的代码对象的:

>>> def outer():
...   def inner(): return 'boo'
...   print inner()
... 
>>> eval(outer.func_code.co_consts[1])
'boo'
>>> 

然而,通常情况下,要把一个代码对象变成可以调用的函数需要相当多的工作(在这个特殊情况下,使用eval就足够了,因为内部函数没有参数也没有非局部变量,但当然这并不是一般情况……在一般情况下,你确实需要提供一些像非局部变量绑定这样的细节!)

撰写回答