python - Python:如何断言闭包的起源?
问题描述
如何断言返回的函数源自外部函数?
def wraps(val):
def func():
return val
return func
a = wraps(5)
# assert that a comes from wraps()
我可以看到它a.__qualname__
包含全局 func: 的名称wraps.<locals>.func
,所以我可以基于它进行测试,但那是 The Right Way™️ 吗?
作为上述观点的扩展,鉴于__qualname__
属性包含封闭函数的名称,这是否意味着它的 ref 被埋在某处,或者该字符串是否会在创建函数时生成并针对它存储当时丢弃的外部函数的引用?
解决方案
你不能这样做,因为函数是在每次wraps
调用中构建的:
>>> a = wraps(1)
>>> b = wraps(1)
>>> a is b
False
>>> id(a)
139880648604800
>>> id(b)
139880648604936
解决方案是返回实际的基本情况并将其放在外面并返回其中的一个partial
:
def func(val):
return val
from functools import partial
def wraps(val):
return partial(func, val)
这样它就可以在您需要的任何地方进行断言。
>>> f = wraps(10)
>>> f.func
<function func at 0x7f38805efd90>
>>> assert f.func is func
>>> assert f.func is not func
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
推荐阅读
- javascript - React redux useSelector 和参数
- java - 类 DrawerItem 需要一种类型参数
- latex - 表中未满 \hbox (badness 10000)
- python - 标准库日志记录加 loguru
- autodesk-forge - 如何将自定义标记导出回 AutoCAD
- kotlin - Kotlin 数据类中的循环引用可能会产生堆栈溢出错误
- ruby-on-rails - 创建对象后用父类扩展类
- graphql - 如何根据 GraphQL (NestJS) 中的条件发送不同的订阅响应?
- android - 如何从 Main Activity 到 Fragment,并从同一个 Fragment 返回到 Main Activity?
- firebase - (Flutter/Dart)从 Firebase 存储中检索,同时从 Firebase Firestore 中检索,异步中的异步