Giter Club home page Giter Club logo

Comments (6)

hramezani avatar hramezani commented on June 4, 2024

Thanks @ziima for reporting this.
I haven't checked your provided example in detail but it seems you are going to load configs from yaml file.

If so, pydantic-settings 2.2 added yaml settings source. please check the docs.

from pydantic-settings.

stinovlas avatar stinovlas commented on June 4, 2024

The problem with YamlConfigSettingsSource here is that you can't read from file with arbitrary name provided by user (let's say by a command line option). There's no way to pass that name into the source.

It was possible to set a private attribute on the BaseSettings. In V1, this instance was passed to custom config source and it could read the value. But now, in V2, the settings instance is not passed down to config source so there's no easy way to pass that value (apart from maybe creating some global variable).

If nothing else, documentation is clearly outdated. Also, I was quite surprised by the fact that if you provide multiple config files, it reads them all and merges the result (instead of just using the first one found). This should also be pointed out in the docs.

from pydantic-settings.

hramezani avatar hramezani commented on June 4, 2024

The problem with YamlConfigSettingsSource here is that you can't read from file with arbitrary name provided by user (let's say by a command line option). There's no way to pass that name into the source.

You can implement your custom YamlConfigSettingsSource and override YamlConfigSettingsSource.__init__ and change the value of yaml_file_path there.

class YamlConfigSettingsSource(InitSettingsSource, ConfigFileSourceMixin):

If nothing else, documentation is clearly outdated. Also, I was quite surprised by the fact that if you provide multiple config files, it reads them all and merges the result (instead of just using the first one found). This should also be pointed out in the docs.

if you mean dotenv file it is already mentioned in Dotenv support section of doc

If you need to load multiple dotenv files, you can pass multiple file paths as a tuple or list. The files will be loaded in order, with each file overriding the previous one.

from pydantic-settings.

stinovlas avatar stinovlas commented on June 4, 2024

The problem with YamlConfigSettingsSource here is that you can't read from file with arbitrary name provided by user (let's say by a command line option). There's no way to pass that name into the source.

You can implement your custom YamlConfigSettingsSource and override YamlConfigSettingsSource.__init__ and change the value of yaml_file_path there.

Yes, but I need to instantiate this custom subclass of YamlConfigSettingsSource in classmethod settings_customise_sources. How do I get it there? The problem is not in the custom settings source, the problem is how to instantiate it with value that is not known until the user runs the code.

Again, in V1, I could use a PrivateAttr on BaseSettings subclass to pass this information down to settings source (because it received settings instance as an argument). In V2, I don't see any way except for some global antipatterns.

If nothing else, documentation is clearly outdated. Also, I was quite surprised by the fact that if you provide multiple config files, it reads them all and merges the result (instead of just using the first one found). This should also be pointed out in the docs.

if you mean dotenv file it is already mentioned in Dotenv support section of doc

I'm not talking about dotenv files. I'm refering to https://docs.pydantic.dev/latest/concepts/pydantic_settings/#customise-settings-sources

settings_customise_sources takes four callables as arguments and returns
any number of callables as a tuple. In turn these callables are called to build
the inputs to the fields of the settings class.

--> Each callable should take an instance of the settings class as its sole argument and return a dict. <--

And also https://docs.pydantic.dev/latest/concepts/pydantic_settings/#other-settings-source

You can also provide multiple files by providing a list of path:

toml_file = ['config.default.toml', 'config.custom.toml']

This doesn't mention anything about the way multiple files are handled.

from pydantic-settings.

hramezani avatar hramezani commented on June 4, 2024

Yeah, you don't have access to the settings model instance in source classes and We can't change it in V2 but it will be an important thing to have in V3.

Regarding multiple files for yaml and toml, it is like dotenv file. files loaded from the list and each file's values override the previous one

from pydantic-settings.

limotley avatar limotley commented on June 4, 2024

+1 On this issue. Being able to parameterize the file source for yaml/toml/etc configurations feels like it should be a basic feature of these settings, and it's frustrating to have to work around it.

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.