def myFunc( a, b ):
def innerFunc( c ):
print c
innerFunc( 2 )
print a, b
内部関数に直接アクセスするにはどうすればよいですか?その関数のオブジェクト/アドレスを次の形式で表示したい
<function innerFunc at 0xa0d5fb4>
myFunc._ getattr _('innerFunc')を試してみましたが、うまくいきませんでした。
def myFunc( a, b ):
def innerFunc( c ):
print c
innerFunc( 2 )
print a, b
内部関数に直接アクセスするにはどうすればよいですか?その関数のオブジェクト/アドレスを次の形式で表示したい
<function innerFunc at 0xa0d5fb4>
myFunc._ getattr _('innerFunc')を試してみましたが、うまくいきませんでした。
関数は関数呼び出しまで存在しないため(関数呼び出し中にのみ存在します)、アクセスできません。
クロージャが重要でない場合は、外部関数内に配置されたコード定数から直接内部関数を作成できます。
inner = types.FunctionType(myFunc.__code__.co_consts[1], globals())
関数のconst値内の位置は異なる場合があります...
このソリューションでは、を呼び出す必要はありませんmyFunc
。
あなたができることは、関数を返すか、呼び出されたときにその親にアタッチすることです...
>>> 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.
|
できません。内部関数は、外部関数が呼び出されるまで存在せず、外部関数が終了すると宣言されます。この場合、内部関数は存在しなくなります。
innerFunc
myFuncはの名前空間内にあるため、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