确定函数是否为嵌套函数

时间:2019-02-12 17:58:41

标签: python function reflection closures

如何确定给定的功能是否为

  1. 关闭函数
  2. 不是闭包的嵌套函数
  3. 不是嵌套函数

我知道我可以说len(function.__closure__) > 0,但这只会回答是否为闭包。非闭包嵌套函数呢?还有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

带有空封闭名称集的嵌套函数与在模块级别定义的函数之间的唯一区别是它们的__qualname__。所有函数都有一个__closure__属性,当没有封闭的名称集时该属性为空。

__qualname__属性是可写的,因此不是检测嵌套函数的可靠方法,但是您可以在其中寻找字符串.<locals>.

>>> def foo():
...     def bar():
...         pass
...     return bar
...
>>> foo().__qualname__
'foo.<locals>.bar'

使用封闭名称的嵌套函数将具有非空的__closure__元组。