我有应该在另一个代码之前加载的配置数据(因为另一个代码使用了它)。因此,现在我看到的唯一方法是在其余导入之前在顶部调用该函数:
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:我所有的类都在单独的文件中声明
这是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
类(它包含mixin):
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
嗯,到目前为止,我已经找到了解决方法:我将from Init.Loaders.InitPreLoader import InitPreLoader
移到了单独的文件中,并在其中调用了InitPreLoader.load()
。但是我不喜欢这种解决方案,因为我的PyCharm IDE将其突出显示为未使用的导入:
import Init.Init.preloader
from World.WorldManager import WorldManager
# ...
也许可以改进此解决方案?还是存在另一个(更优雅的)隔离?