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

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

<function innerFunc at 0xa0d5fb4>

我尝试使用myFunc._ getattr _( 'innerFunc' )但这没有用。

4

4 回答 4

5

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

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

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

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

此解决方案不需要调用myFunc.

于 2012-06-25T23:38:32.350 回答
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.
  |


于 2012-06-25T23:29:20.540 回答
2

你不能。内部函数在外部函数被调用之前不存在,并且在外部函数退出时被decref'ed,在这种情况下意味着它不再存在。

于 2012-06-25T23:23:26.797 回答
2

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

像这样:

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
于 2012-06-25T23:24:09.667 回答