如何从Python shell调用内部函数?

如何从Python shell调用内部函数?,python,nested,private-methods,Python,Nested,Private Methods,我有一些代码(我不能轻易修改),其形式如下: def foo(x): do_other_stuff_that_I_do_not_want_to_do() def bar(): "do something" str(x) bar() 我想直接从Python shell调用bar()。我不介意使用co_globals,或其他内部位。我觉得这可能是不可能的;是吗?不可能像您所说的那样使用代码获取内部函数对象——所述对象仅在外部函数运行时(即调用时)创建(通过

我有一些代码(我不能轻易修改),其形式如下:

def foo(x):
   do_other_stuff_that_I_do_not_want_to_do()
   def bar():
      "do something"
      str(x)
   bar()
我想直接从Python shell调用
bar()
。我不介意使用
co_globals
,或其他内部位。我觉得这可能是不可能的;是吗?

不可能像您所说的那样使用代码获取内部函数对象——所述对象仅在外部函数运行时(即调用时)创建(通过
def
语句)

另一方面,请注意像
foo
这样的外部函数通常被编码为返回内部函数作为其结果(例如,通过将
bar()
更改为
return bar
)作为最后一行,完全作为“函数工厂”(通常作为“闭包工厂”)工作而不是将内部函数的存在作为一种私有的、秘密的实现细节;但是您的编码选择了后一种路径

编辑…:

但是,可以获取内部函数的代码对象:

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

然而,一般来说,将代码对象变成可调用函数需要大量的工作(在这种特殊情况下,
eval
就足够了,因为内部函数既没有参数,也没有任何非局部变量,但当然,这与一般情况并不接近……在这种情况下,您必须提供非局部变量绑定这样的细节!)

Hm。这就是我的想法。但是,可以访问内部函数的代码对象(通过
func\u code.co\u consts
),这就引出了一个问题——我可以评估该代码对象吗?回答:是的,使用eval()。但它抱怨自由变量…谢谢!下一步是找出如何将自由变量提供给code对象。我应该提出一个新问题来问这个问题,还是继续这个问题?@Jesse,这已经够难了,我建议你打开一个单独的Q!可以。或者我可能现在就放弃它;我可以复制并粘贴代码,毕竟…;-)非常感谢你的帮助!foo做的最后一件事是调用bar,为什么不直接调用foo()?@paul,因为foo()除了调用bar()之外,还做其他我不想做的事情。“我不能轻易修改”通常是错误的。试着和作者谈谈。好吧,这主要是出于过期的目的——如果我真的要将它提交给项目(rdiff备份),我肯定会要求进行必要的更改,以允许我重用所有可能的代码。