Cannot hash thread.RLock for secrets.toml

Hi team - I am running into an issue using st.cache when trying to call items in the secrets.toml file. I still get the cannot hash error for thread.RLock even when using the hash_funcs solution that I’ve found in the forums. Any ideas?

@st.cache(hash_funcs={"_thread.RLock": lambda _: None})
def get_s3_auth():
    aws_credentials = { 
        "key": st.secrets["AWS_ACCESS_KEY_ID"], 
        "secret": st.secrets["AWS_SECRET_ACCESS_KEY"]}
    return aws_credentials

Hi @aruvalcaba, welcome to the community! :wave: :partying_face:

What version of Streamlit are you using? I would suggest upgrading to the latest version of Streamlit and to use @st.experimental_memo instead, as the function returns a dictionary (data object):

  1. Upgrade to the latest version of Streamlit:

    pip install --upgrade streamlit
    
  2. Replace st.cache with st.experimental_memo:

    @st.experimental_memo
    def get_s3_auth():
        aws_credentials = { 
            "key": st.secrets["AWS_ACCESS_KEY_ID"], 
            "secret": st.secrets["AWS_SECRET_ACCESS_KEY"]}
        return aws_credentials
    

That should resolve the cryptic UnhashableTypeError.

Best, :balloon:
Snehan

Hi Snehan - I’m running version 1.7.0. This was mainly causing issues when trying to also cache a function upstream so instead I called this function elsewhere and fed the creds in and everything is working fine now. If that breaks somehow I’ll give your experimental_memo a shot. Thanks for the help!

A second piece to keep in mind is that your get_s3_auth function isn’t actually doing anything cacheable, so caching can be removed altogether. Creating a dict referencing the keys of another dict is a constant time operation.

1 Like

Thanks Randy, you make a good point. The function changed over time and I think lost its cacheable-ness.