def myFunc( a, b ):
def innerFunc( c ):
print c
innerFunc( 2 )
print a, b
如何直接访问内部函数?我希望该函数的对象/地址格式为
<function innerFunc at 0xa0d5fb4>
我尝试使用 myFunc ._ getattr _('innerFunc'),但这不起作用。
答案 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