在Python中,我有一个decorator,如果函数是在调用它的函数中本地定义的,它必须跳过任何实际工作。我做了一个简单的测试脚本:
def fn1():
# @my_decorator will be here
def fn2():
pass
print(fn2)
return fn2
x = fn1()
print(x)
print(x.__module__)
它打印的是:
^{pr2}$如我所见,Python看到函数是在局部空间中定义的(在打印文本中是<locals>
),但我不知道如何找到这部分数据。我浏览了inspect
模块,没有看到类似的内容。在
我不能依赖函数是否是全局函数。在
我用什么?在
首先,直接方法是检查the ^{} flag is set on the function's code object :
也就是说,如果你关心的是你是否真的结束了任何事情,还有另一种方法。一个不使用封闭范围中任何内容的函数是嵌套的,但不是闭包,这种区别通常很重要。例如:
^{pr2}$因为
^{3}$bar
没有使用foo
调用范围内的变量,所以不是正在进行闭包。相比之下,即使它是一个垃圾引用,这个只是通过从封闭范围中读取x
的值来实现闭包:可以通过测试
__closure__
属性(如果没有嵌套变量被关闭,则为None
)或检查__code__
对象的co_freevars
属性(这是一个封闭的名称元组,因此如果它是空的,那么它就不是闭包,尽管它可能仍然是一个嵌套函数):好吧,这里有个老套的方法:
不过,我觉得它很脆弱。在
另一种方法是使用
^{pr2}$Frame
,但我更不喜欢这样,我想:相关问题 更多 >
编程相关推荐