Giter Club home page Giter Club logo

Comments (6)

sydney-runkle avatar sydney-runkle commented on June 19, 2024 1

@sujuka99,

Thanks for the prompt response. After thinking about this more, I do think this is actually a bug. We guarantee that if an environment variable is specified in 2 locations (without an alias), we do prioritize and select appropriately, so I don't think the case should be any different when aliases are used.

I'll move this issue to pydantic-settings and we can work on a fix there 😄.

At the moment, you could set extra='allow' within the model_config on your FakeConfig class, but it's an unclean workaround for the time being.

from pydantic-settings.

hramezani avatar hramezani commented on June 19, 2024 1

similar to #148

from pydantic-settings.

sydney-runkle avatar sydney-runkle commented on June 19, 2024

Hi @sujuka99,

Thanks for reporting this 😄. The reasoning behind this is a bit complicated. So pydantic-settings parses your various environment settings sources correctly, and effectively generates the following input to your FakeConfig class:

{'bar_env': 'env', 'bar_init': 'init'}

However, the difficulty here is that then the following is occurring:

from pydantic import AliasChoices, BaseModel, ConfigDict, Field


class FakeConfig(BaseModel):
    bar: str = Field(validation_alias=AliasChoices('bar_env', 'bar_init'))

    model_config = ConfigDict(extra='forbid')


fc = FakeConfig.model_validate({'bar_env': 'env', 'bar_init': 'init'})

However, the nature of BaseSettings models is that they have the setting extra='forbid' set by default (shown explicitly above). So what's really happening is that bar is set to env, but then bar_init is recognized as an extra field. One option would be to set extra='allow' on your FakeConfig model, but then you'd get an extra bar_init field set on your model.

Hopefully that explanation of the behavior makes some more sense. We're set up to prioritize fields specified in more highly prioritized sources, but not in the case of different aliases.

If this is behavior that you'd like to see added, I suggest we move this to a feature request on the pydantic-settings repo 😄.

from pydantic-settings.

sujuka99 avatar sujuka99 commented on June 19, 2024

Hey @sydney-runkle, thanks for the thorough explanation! I would certainly like to see the behavior added 😄, should I move the request?

Ultimately I would want to replicate what Field(..., env=...) did in V1. Is there a way to achieve it in V2 currently?

from pydantic-settings.

D1maD1m0nd avatar D1maD1m0nd commented on June 19, 2024

Hello, please tell me what I'm doing wrong, this code worked before update 2.1.0 -> 2.2.1


from pydantic_settings import BaseSettings, SettingsConfigDict


class Base(BaseSettings):
    model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')


class Settings(Base):
    model_config = SettingsConfigDict(env_prefix='APP_')
    ENVIRONMENT: str = ""
    REDIS_ADDRESS: str = ""
    MEANING_OF_LIFE: int = 0
    MY_VAR: str = ""


class ServerSettings(Base):
    model_config = SettingsConfigDict(env_prefix='SERV_')
    ADDR: str = ""


class GlobalSettings:
    app_settings = Settings()
    srv_settings = ServerSettings()


g_settings = GlobalSettings()

print(g_settings.app_settings.model_dump())
print(g_settings.srv_settings.model_dump())

.env

APP_ENVIRONMENT="production"
APP_REDIS_ADDRESS=localhost:6379
APP_MEANING_OF_LIFE=42
APP_MY_VAR='Hello world'


SERV_ADDR='localhost'

from pydantic-settings.

hramezani avatar hramezani commented on June 19, 2024

@D1maD1m0nd probably related to #245

If you get ValidationError complaining about extra fields, you can fix it by adding extra='ignore'

from pydantic-settings.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.