Издевательство над классом в Python работает в пакете пространства имен, но не в обычном пакете.Python

Программы на Python
Anonymous
Издевательство над классом в Python работает в пакете пространства имен, но не в обычном пакете.

Сообщение Anonymous »

Контекст
Я пишу модульные тесты для своего приложения.
У меня есть модуль в файле Configuration/connections.py с конфигурацией (обычно определяемой переменными среды):

Код: Выделить всё

from typing import Literal

from pydantic_settings import BaseSettings

class StorageConfig(BaseSettings):
storage_name: Literal["file", "s3"]
эта конфигурация вызывается в модуле Connections/storage/main.py:

Код: Выделить всё

import fsspec

from configuration.connections import StorageConfig

storage_config = StorageConfig()

fs: fsspec.AbstractFileSystem = fsspec.filesystem(storage_config.storage_name)
и поскольку конфигурация среды не существует, когда я запускаю модульные тесты, я пытаюсь имитировать объект StorageConfig:

Код: Выделить всё

import pytest
from pydantic import BaseModel

@pytest.fixture(autouse=True)
def local_config(mocker):
class LocalStorageConfig(BaseModel):
storage_name: str = "file"

mocker.patch("configuration.connections.StorageConfig", new=LocalStorageConfig)
Проблема
В зависимости от архитектуры моей папки макет работает, а иногда и нет.
  • Если у меня есть Connections.storage как пакет пространства имен, и мой тест находится в Connections/storage/tests/test_storage.py, и я исправляю непосредственно Configuration.connections. StorageConfig (в отличие от того, что мне хотелось бы сделать в документации), он работает нормально.
  • Если Connections.storage< /code> — обычный пакет, а все остальное как в 1., он больше не работает
  • Если я перенесу свой тест в test/integration/test_storage.py и оставьте все остальное, как в 2., это работает.
Вопрос
  • Почему обычный пакет и пакет пространства имен влияют на макет?
  • Почему положение моего тестового файла влияет на макет?
    Почему это не работает, когда я исправляю Connections.storage.main.StorageConfig, как предполагает документация?
Спасибо, что уделили время и помогли мне разобраться в этой проблеме :)

Подробнее здесь: https://stackoverflow.com/questions/790 ... -regular-p

Вернуться в «Python»