使用Dynaconf加载设置 - Python 3.10与3.11的不同表现

0 投票
1 回答
17 浏览
提问于 2025-04-13 00:03

我正在使用Dynaconf 3.2.5来从多个文件中加载项目设置。当我在Python 3.10.9中运行这段代码时,一切都正常,但在使用3.11.1时,设置却没有加载。

以下是代码的一些主要部分。


DEFAULT_CONFIG_DIR = Path(__file__).parent / 'config'

class Config(BaseModel):
    class FileFormats(str, Enum):
        """Supported configuration file formats."""

        TOML = 'toml'
        YAML = 'yaml'
        JSON = 'json'
        INI = 'ini'
        ENV = 'env'


   config_dir: DirectoryPath = Field(
        DEFAULT_CONFIG_DIR,
        description='The directory containing the configuration files.',
    )

    recursive: bool = Field(
        True,
        description='If True, load config files from subdirectories.',
    )
    
    use_file_formats: Annotated[
        list[FileFormats],
        Field(
            [FileFormats.TOML, FileFormats.YAML],
            min_length=1,
            description='The file formats to use for loading configuration parameters.',
        ),
    ]

    _params: Dynaconf | None = None

    @computed_field  # type: ignore[misc]
    @cached_property
    def params(self) -> Dynaconf:

        if self._params is None:
            self._params = self._load_params()

        return self._params

    def _load_params(self) -> Dynaconf:

        assert self._params is None

        if not self.config_dir.exists():
            raise FileNotFoundError(
                f'Config directory {self.config_dir} does not exist.'
            )

        # Find the list of configuration files to load
        settings_files: list[DirectoryPath | str] = []
        for file_format in self.use_file_formats:
            if self.recursive:
                settings_files += list(self.config_dir.rglob(f'*.{file_format}'))
            else:
                settings_files += list(self.config_dir.glob(f'*.{file_format}'))

        return Dynaconf(
            # envvar_prefix=False,
            merge_enabled=True,
            # environments=False,
            settings_files=settings_files,
        )

这段代码在Python 3.10中运行得很好。当我在Python 3.11中运行时,代码是可以执行的,但文件中的数据实际上并没有被加载。我不太确定为什么会这样。

1 个回答

0

这是个很傻的错误,我用了 file_format 而不是 file_format.value。我被这个问题搞糊涂了,因为在3.10版本中它是可以正常工作的。

撰写回答