Как правильно вызвать функцию preloader перед импортом в Python? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть данные конфигурации, которые должны быть загружены перед другим кодом (потому что другой код использует его). Итак, пока я вижу, что единственный способ сделать это - вызвать функцию вверху, прежде чем импортировать остальные:

from Init.Loaders.InitPreLoader import InitPreLoader
# this is my config loader
InitPreLoader.load()

from World.WorldManager import WorldManager
from Init.Loaders.InitLoader import InitLoader
from Init.Registry.InitRegistry import InitRegistry
from Utils.Debug import Logger
# ...
if __name__ == '__main__':
    # ...
    InitLoader.load()

Можно ли сделать это более элегантным способом и избежать нарушения pep8?

PS Если мне нужно поделиться большим кодом, пожалуйста, дайте мне знать

UPD : все мои классы объявлены в отдельных файлах

Это PreLoader:

from Typings.Abstract.AbstractLoader import AbstractLoader
from Init.Registry.InitRegistry import InitRegistry
from Config.Init.configs import main_config


class InitPreLoader(AbstractLoader):

    @staticmethod
    def load(**kwargs):
        InitRegistry.main_config = main_config

Это Реестр (где я храню все свои инициализированные данные):

from Typings.Abstract.AbstractRegistry import AbstractRegistry


class InitRegistry(AbstractRegistry):

    main_config = None

    login_server = None

    world_server = None

    world_observer = None

    identifier_region_map = None

    region_octree_map = None

Родителем всех классов (кроме AbstractRegistry) является класс AbstractBase (содержит миксин):

from abc import ABC

from Config.Mixins.ConfigurableMixin import ConfigurableMixin


class AbstractBase(ConfigurableMixin, ABC):
    pass

Этот миксин работает с main_config с InitRegistry. Кроме того, после вызова PreLoader load я загружаю остальные данные с помощью InitLoader.load() (см. Первый снимок кода):

from Typings.Abstract.AbstractLoader import AbstractLoader
from Init.Registry.InitRegistry import InitRegistry
from Server.Init.servers import login_server, world_server
from World.Observer.Init.observers import world_observer
from World.Region.Init.regions import identifier_region_map, region_octree_map


class InitLoader(AbstractLoader):

    @staticmethod
    def load(**kwargs):
        InitRegistry.login_server = login_server
        InitRegistry.world_server = world_server
        InitRegistry.world_observer = world_observer
        InitRegistry.identifier_region_map = identifier_region_map
        InitRegistry.region_octree_map = region_octree_map

1 Ответ

0 голосов
/ 15 апреля 2020

Ну, а пока я нашел решение: я переместил from Init.Loaders.InitPreLoader import InitPreLoader в отдельный файл и вызвал InitPreLoader.load() там. Но мне не нравится это решение, потому что моя среда PyCharm IDE выделяет его как неиспользуемый импорт:

import Init.Init.preloader
from World.WorldManager import WorldManager
# ...

Может быть, можно улучшить это решение? Или, может быть, существует другое (более элегантное) решение?

...