如何从Python命令行调用内部函数?
我有一些代码(我不太容易修改),它的形式是这样的:
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
就足够了,因为内部函数没有参数也没有非局部变量,但当然这并不是一般情况……在一般情况下,你确实需要提供一些像非局部变量绑定这样的细节!)