如何在 Python 中导入前正确调用预加载器函数?
How to correctly call preloader function before imports in Python?
我有配置数据应该在另一个代码之前加载(因为另一个代码使用它)。
所以,现在我看到唯一的方法是在 rest 导入之前调用顶部的函数:
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?
P.S。如果我需要分享更多代码,请告诉我
UPD:我的所有 classes 在单独的文件中声明
这是预加载器:
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
所有 classes(AbstractRegistry
除外)的父级是 AbstractBase
class(它包含 mixin):
from abc import ABC
from Config.Mixins.ConfigurableMixin import ConfigurableMixin
class AbstractBase(ConfigurableMixin, ABC):
pass
此混音适用于 InitRegistry
中的 main_config
。
此外,在调用 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
好吧,现在我找到了解决方案:我将 from Init.Loaders.InitPreLoader import InitPreLoader
移动到单独的文件并在那里调用 InitPreLoader.load()
。但我不喜欢这个解决方案,因为我的 PyCharm IDE 将其突出显示为未使用的导入:
import Init.Init.preloader
from World.WorldManager import WorldManager
# ...
也许可以改进这个解决方案?或者可能存在另一个(更优雅的)独奏?
我有配置数据应该在另一个代码之前加载(因为另一个代码使用它)。 所以,现在我看到唯一的方法是在 rest 导入之前调用顶部的函数:
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?
P.S。如果我需要分享更多代码,请告诉我
UPD:我的所有 classes 在单独的文件中声明
这是预加载器:
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
所有 classes(AbstractRegistry
除外)的父级是 AbstractBase
class(它包含 mixin):
from abc import ABC
from Config.Mixins.ConfigurableMixin import ConfigurableMixin
class AbstractBase(ConfigurableMixin, ABC):
pass
此混音适用于 InitRegistry
中的 main_config
。
此外,在调用 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
好吧,现在我找到了解决方案:我将 from Init.Loaders.InitPreLoader import InitPreLoader
移动到单独的文件并在那里调用 InitPreLoader.load()
。但我不喜欢这个解决方案,因为我的 PyCharm IDE 将其突出显示为未使用的导入:
import Init.Init.preloader
from World.WorldManager import WorldManager
# ...
也许可以改进这个解决方案?或者可能存在另一个(更优雅的)独奏?