You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:27:01