python-dependency-injector
python-dependency-injector copied to clipboard
Support pydantic v2 BaseSettings
In pydantic 2.0+ the BaseSettings
class has been moved into a optional package, pydantic-settings. The configuration provider's from_pydantic
method expect to find it in the pydantic package:
https://github.com/ets-labs/python-dependency-injector/blob/master/src/dependency_injector/providers.pyx#L1806-L1816
This results in an error like:
container.config.from_pydantic(settings)
src/dependency_injector/providers.pyx:2381: in dependency_injector.providers.Configuration.from_pydantic
???
.venv/lib/python3.11/site-packages/pydantic/__init__.py:218: in __getattr__
return _getattr_migration(attr_name)
.venv/lib/python3.11/site-packages/pydantic/_migration.py:294: in wrapper
raise PydanticImportError(
E pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.4/migration/#basesettings-has-moved-to-pydantic-settings for more details.
Furthermore, the BaseModel.dict
method used in the last line of this method is deprecated and has been replaced by BaseModel.model_dump
. The method still exists but emits deprecation warnings when accessed.
I created PR covering this issue.
A work around that I used for this would be:
config = providers.Configuration()
json_config = Settings().model_dump(mode='json')
config.from_dict(json_config)
The same issue
Temporary solved with:
config = providers.Configuration()
config.from_dict(AppSecrets().dict())
FYI for anyone else who lands here: @cdonate's workaround is compatible with Pydantic v2.
While @pow3rpi's workaround is technically compatible with Pydantic v2, the .dict()
and .json()
model serialization methods are marked as deprecated in v2 and will eventually be removed in favor of .model_dump()
and .model_dump_json()
.
@bmcandr Good point! Thanks.