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

如何在Streamlit中正确缓存类内expensive_computation方法的运行结果

报错根因

报错的核心原因是expensive_computation是类的实例方法,Streamlit缓存装饰器默认会对方法的所有输入参数做哈希校验,第一个参数self指向类实例本身,实例包含的类方法、内部属性等都是Streamlit默认无法哈希的类型,因此触发报错。你之前写的hash_funcs参数值为字符串不符合要求,hash_funcs对应的值必须是可调用的哈希处理函数,所以无法生效。

解决方案

方案1:改造为静态方法(无实例依赖时首选)

如果expensive_computation不需要依赖实例的可变属性,直接改为静态方法即可,无需传入self参数,从根源避免哈希问题:

import streamlit as st
class c:
    @staticmethod
    def download_from_GCS(b, c):
        print(b + c)
    
    @st.cache(suppress_st_warning=True)
    @staticmethod
    def expensive_computation(a):
        c.download_from_GCS(b=a, c=a+10)
        print(a)

c.expensive_computation(a=1)

方案2:配置hash_funcs跳过self哈希

如果必须保留实例方法结构,可以在缓存装饰器中配置hash_funcs,对类实例的哈希直接返回固定值,跳过实例哈希校验:

import streamlit as st
class c:
    def download_from_GCS(self, b, c):
        print(b + c)
    
    @st.cache(suppress_st_warning=True, hash_funcs={c: lambda _: None})
    def expensive_computation(self, a):
        self.download_from_GCS(b=a, c=a+10)
        print(a)

c().expensive_computation(a=1)

注意:该方案下如果类实例的内部属性发生变化,缓存不会自动更新,需要自行确保逻辑一致性。

方案3:使用新版Streamlit缓存API

如果你使用的是较新版本的Streamlit,推荐用已替代@st.cache的@st.cache_dataAPI,可以直接指定忽略self参数,配置更简单:

import streamlit as st
class c:
    def download_from_GCS(self, b, c):
        print(b + c)
    
    @st.cache_data(ignore_args=["self"])
    def expensive_computation(self, a):
        self.download_from_GCS(b=a, c=a+10)
        print(a)

c().expensive_computation(a=1)

内容的提问来源于stack exchange,提问作者Alessandro Ceccarelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:36:04