PHP带use关键字的缓存回调闭包如何编写等价Python实现
Python 不需要类似 PHP 的use()语法向闭包传递外部变量,lambda 或自定义嵌套函数会自动捕获外层作用域的可用变量,仅读取变量的场景下无需额外声明,直接引用即可。
等价 Python 实现代码
# 对应原PHP代码中的 MoveSetHelper::LEVELING_UP_TYPE 常量,可根据实际定义调整 LEVELING_UP_TYPE = "leveling_up" return self.cache.get( f"pokepedia.wikitext.pokemonmove.{name},{generation}.level", # 直接在lambda中引用外层的name、generation变量即可 lambda: self.moveClient.getPokemonMoves( name, generation, LEVELING_UP_TYPE ) )
可选:缓存get方法参考实现
如果你的缓存类还没有适配「缓存未命中时执行可调用对象回源」的逻辑,可以参考如下实现:
class Cache: def __init__(self): # 用字典做内存存储示例,可替换为redis等实际缓存介质 self._storage = {} def get(self, key: str, default=None): if key in self._storage: return self._storage[key] # 第二个参数是可调用对象时,执行回源逻辑并缓存结果 if callable(default): result = default() self._storage[key] = result return result return default
注意事项
如果你的使用场景是在循环中定义闭包,需要注意 Python 闭包的延迟绑定特性:闭包访问的变量会在闭包实际执行时才取值,而非定义时。这种场景下可以通过给lambda传默认参数的方式固定变量值:
# 错误示例:循环结束后i的值都是9,所有闭包执行时都取i=9 funcs = [lambda: i for i in range(10)] # 正确示例:通过默认参数在定义时绑定当前i的值 funcs = [lambda i=i: i for i in range(10)]
内容的提问来源于stack exchange,提问作者julien marcon
相关产品推荐
相关产品推荐

