Python 确定函数是否为嵌套函数

Python 确定函数是否为嵌套函数,python,function,reflection,closures,Python,Function,Reflection,Closures,如何识别给定函数是否为: 闭包函数 不是闭包的嵌套函数 不是嵌套函数 我知道我可以说len(function.\u closure\u)>0,但这只能回答这是否是一个闭包。那么非闭包嵌套函数呢?还有更好的方法吗?具有空封闭名称集的嵌套函数与在模块级别定义的函数之间的唯一区别是它们的\uuuuuu qualname\uuu。所有函数都有一个\uuuuu closure\uuuu属性,当没有闭合的名称集时,该属性为空 \uuuu qualname\uuuu属性是可写的,因此不是检测嵌套函数的可靠方法

如何识别给定函数是否为:

  • 闭包函数
  • 不是闭包的嵌套函数
  • 不是嵌套函数
  • 我知道我可以说
    len(function.\u closure\u)>0
    ,但这只能回答这是否是一个闭包。那么非闭包嵌套函数呢?还有更好的方法吗?

    具有空封闭名称集的嵌套函数与在模块级别定义的函数之间的唯一区别是它们的
    \uuuuuu qualname\uuu
    。所有函数都有一个
    \uuuuu closure\uuuu
    属性,当没有闭合的名称集时,该属性为空

    \uuuu qualname\uuuu
    属性是可写的,因此不是检测嵌套函数的可靠方法,但您可以在其中查找字符串

    >>> def foo():
    ...     def bar():
    ...         pass
    ...     return bar
    ...
    >>> foo().__qualname__
    'foo.<locals>.bar'
    
    >>def foo():
    ...     def bar():
    ...         通过
    ...     回程杆
    ...
    >>>foo()__
    “foo..bar”
    

    使用闭包名称的嵌套函数将有一个非空的
    \uuuuu closure\uuuuu
    元组。

    所有嵌套函数都是闭包,无论是否有任何实际的闭包。为什么需要知道这一点?如果函数没有关闭任何变量,那么它嵌套的事实没有任何区别。你需要它做什么,你想解决什么问题?@MartijnPieters我在运行时向现有函数注入代码,并且意识到在这样做时我需要以不同的方式对待闭包。@AvivCohn:只有在名称上有闭包时才可以。如果要修补这些函数,请参阅。