访问函数的内部函数

时间:2012-06-25 23:22:22

标签: python python-2.7

def myFunc( a, b ):
  def innerFunc( c ):
    print c
  innerFunc( 2 )
  print a, b

如何直接访问内部函数?我希望该函数的对象/地址格式为

<function innerFunc at 0xa0d5fb4>

我尝试使用 myFunc ._ getattr _('innerFunc'),但这不起作用。

4 个答案:

答案 0 :(得分:5)

由于函数在函数调用之前不存在(并且仅在函数调用期间存在),因此无法访问它。

如果闭包不重要,可以直接从放在外部函数内的代码常量构建内部函数:

inner = types.FunctionType(myFunc.__code__.co_consts[1], globals())

函数const值内的位置可能会有所不同......

此解决方案不需要调用myFunc

答案 1 :(得分:4)

您可以做的是返回函数或在调用时将其附加到父级...

>>> def myFunc( a, b ):
...     def innerFunc( c ):
...         print c
...     innerFunc( 2 )
...     myFunc.innerFunc = innerFunc
...     print a, b
...
>>>
>>> myFunc(1,2)
2
1 2
>>> myFunc.innerFunc(3)
3
>>> 

虽然显然你可以使用特殊属性访问源代码,但是这些函数对象有... myFunc.func_code虽然这似乎是访问一些严重的东西

>>> help(myFunc.func_code)
 Help on code object:
 class code(object)
  |  code(argcount, nlocals, stacksize, flags, codestring, constants, names,
  |        varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])
  |  
  |  Create a code object.  Not for the faint of heart.
  |


答案 2 :(得分:2)

你做不到。内部函数在调用外部函数之前不存在,并且在外部函数退出时减少,在这种情况下意味着它不再存在。

答案 3 :(得分:2)

您无法直接从myFunc外部呼叫innerFunc,因为它位于myFunc的命名空间内。 调用innerFunc的一种方法是从innerFunc

返回myFunc对象 像这样:

def myFunc( a, b ):
  def innerFunc( c ):
    print c
  print a, b
  return innerFunc #return the innerFunc from here

x=myFunc(1,2)
x(3) # calling x now calls innerFunc