只是好奇起见,我想知道这个..
我知道内部函数的范围仅限于外部函数体,但仍是有没有什么办法让我们可以访问内部函数变量的范围之外,或致电其范围之外的内部函数?
In [7]: def main():
...: def sub():
...: a=5
...: print a
...:
In [8]: main()
In [9]: main.sub()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/home/dubizzle/webapps/django/dubizzle/<ipython-input-9-3920726955bd> in <module>()
----> 1 main.sub()
AttributeError: 'function' object has no attribute 'sub'
In [10]:
>>> def main():
... def sub():
... a=5
... print a
...
>>> main.__code__.co_consts
(None, <code object sub at 0x2111ad0, file "<stdin>", line 2>)
>>> exec main.__code__.co_consts[1]
5
你可以,如果你返回内部函数的值
>>> def main():
... def sub():
... a = 5
... print a
... return sub
...
>>> inner = main()
>>> inner()
5
或者你可以将它连接到主作为一个属性(函数对象毕竟):
>>> def main():
... def sub():
... a = 5
... print a
... main.mysub = sub
...
>>> main()
>>> main.mysub()
5
但你最好记录您很好的理由这样做,因为它几乎肯定会不足为奇阅读你的代码:-)
函数只是另一个对象在Python,可以反思。
您可以在运行时获得外部函数体和解析/ EVAL它使当前命名空间中的功能。
>>> import inspect
>>> def outer():
def inner():
print "hello!"
>>> inspect.getsourcelines(outer)
([u'def outer():\n', u' def inner():\n', u' print "hello!"\n'], 1)
不是真的一样的东西叫outer.inner(),但是如果你不使内功能明确可用的外部函数的范围之内,我想这是唯一的可能性。
例如,一个很天真的eval尝试可能是:
>>> exec('\n'.join([ line[4:] for line in inspect.getsourcelines(outer)[0][1:] ]))
>>> inner()
hello!
不,你不能。 内部函数不是外部函数的属性。
其后的内部函数只存在def
被执行的语句(在执行外部功能),它停止时存在的函数退出。
你可以return
过程的内部函数。
内部函数仅仅是一个局部变量就像任何其他这样的规则也同样适用。 如果您要访问它,你要退回去。
文章来源: Can we access inner function outside its scope of outer function in python using outer function?