Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pydantic Settings: TypeError: cannot pickle '_thread.lock' object

I am facing an issue with pydantic.BaseSettings and prometheus_client.Summary. The snippet below throws an Exception when trying to be executed:

from prometheus_client import Summary
from pydantic import BaseSettings

class Settings(BaseSettings):
    app_name: str = 'any_app_name'
    any_boolean: bool = False
    any_summary: Summary = Summary('my_summary','My Summary')

s = Settings()

Here comes the stacktrace:

  File "/Users/XXX/workspace/src/settings_summary.py", line 4, in <module>
    class Settings(BaseSettings):
  File "pydantic/main.py", line 252, in pydantic.main.ModelMetaclass.__new__
  File "pydantic/fields.py", line 309, in pydantic.fields.ModelField.infer
  File "pydantic/fields.py", line 271, in pydantic.fields.ModelField.__init__
  File "pydantic/fields.py", line 344, in pydantic.fields.ModelField.prepare
  File "pydantic/fields.py", line 368, in pydantic.fields.ModelField._set_default_and_type
  File "pydantic/fields.py", line 280, in pydantic.fields.ModelField.get_default
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 270, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 146, in deepcopy
    y = copier(x, memo)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 230, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 270, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 146, in deepcopy
    y = copier(x, memo)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 230, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/copy.py", line 161, in deepcopy
    rv = reductor(4)
TypeError: cannot pickle '_thread.lock' object

When removing the Summary line code runs:

from pydantic import BaseSettings

class Settings(BaseSettings):
    app_name: str = 'any_app_name'
    any_boolean: bool = False

s = Settings()

Do you have any idea how to fix it?

Thanks a lot in advance...

like image 584
Gunar Maiwald Avatar asked Aug 10 '26 14:08

Gunar Maiwald


1 Answers

Easiest for me was to use an automatically excluded attribute:

from typing import ClassVar
class Settings(BaseSettings):
    any_summary: ClassVar[Summary] = Summary('my_summary','My Summary')
like image 60
Martin Tapp Avatar answered Aug 12 '26 04:08

Martin Tapp