我们可以访问内部函数的外部函数的范围之外使用外部函数蟒蛇?(Can we access inner

2019-09-20 03:06发布

只是好奇起见,我想知道这个..
我知道内部函数的范围仅限于外部函数体,但仍是有没有什么办法让我们可以访问内部函数变量的范围之外,或致电其范围之外的内部函数?

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]: 

Answer 1:

>>> 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


Answer 2:

你可以,如果你返回内部函数的值

>>> 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

但你最好记录您很好的理由这样做,因为它几乎肯定会不足为奇阅读你的代码:-)



Answer 3:

函数只是另一个对象在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!


Answer 4:

不,你不能。 内部函数不是外部函数的属性。

其后的内部函数只存在def被执行的语句(在执行外部功能),它停止时存在的函数退出。

你可以return过程的内部函数。



Answer 5:

内部函数仅仅是一个局部变量就像任何其他这样的规则也同样适用。 如果您要访问它,你要退回去。



文章来源: Can we access inner function outside its scope of outer function in python using outer function?