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

できません。内部関数は、外部関数が呼び出されるまで存在せず、外部関数が終了すると宣言されます。この場合、内部関数は存在しなくなります。

于 2012-06-25T23:23:26.797 に答える
2

innerFuncmyFuncはの名前空間内にあるため、myFuncの外部から直接呼び出すことはできませんmyFunc。innerFuncを呼び出す1つの方法は、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
于 2012-06-25T23:24:09.667 に答える