使用下面的代码:
def wrap( x ):
def wrapped( y ):
return x + y
return wrapped
f = wrap( 1 )
是否可以看出f是一个被函数包裹的函数
wrap
?
显示变量f,它是可见的:
>>> f
<function wrap.<locals>.wrapped at 0x10067cf40>
但是有没有办法确定|| |被用作包装函数?
wrap
谢谢。
Thanks.
在 Python 中,没有直接的方法可以确定一个函数是否被另一个特定的函数包装。函数包装是一种运行时的行为,Python 不保留被包装函数的创建历史记录。
从你的例子来看:
def wrap( x ):
def wrapped( y ):
return x + y
return wrapped
f = wrap( 1 )
虽然你可以通过
f.__name__
看到
f
函数的名字是
wrapped
,但这并不能保证它是被
wrap
函数包装的。
一些间接的方法可以帮助你推测一个函数是否被包装,以及被什么包装,但这并不总是可靠:
-
检查函数的
__closure__
属性 : 被包装的函数可能会在其__closure__
属性中保存对外部函数作用域的引用。你可以检查这些cell
对象,看看是否能找到与wrap
函数相关的线索。
```python
f. closure [0].cell_contents 1 ```
在这个例子中,你可以看到
f.__closure__
中包含了
wrap
函数中
x
的值。但这仍然不是确凿的证据,只能作为一种参考。
- 使用装饰器 : 如果你能控制代码,可以使用装饰器来标记被包装的函数,这样你就可以明确地识别它们。
```python def wrap_marker(func): func. wrapped_by = "wrap" return func
@wrap_marker def wrap( x ): def wrapped( y ): return x + y return wrapped
f = wrap(1)
print(f. wrapped_by ) # 输出: wrap ```
- 调试和代码分析 : 你可以使用调试器或代码分析工具来跟踪函数的调用流程,并尝试识别包装函数。
总而言之,没有万无一失的方法可以确定一个函数是否被另一个特定函数包装。你可以使用一些间接的方法来推测,但要记住这些方法并不总是可靠的。
标签:python From: 78780932