Справочная информация:
Я пишу модуль для настройки встроенной системы. В этом контексте мне нужно загрузить некоторые модули и выполнить некоторые системные настройки.
Контекст:
У меня есть родительский класс, содержащий некоторый общий код (загрузка файла конфигурации, сборка ssh-соединения и т. Д.), Используемый для нескольких дочерних классов. Одним из них является класс модуля, который устанавливает модуль и поэтому использует, помимо прочего, соединение ssh и файл конфигурации.
Моя цель - предоставить доступ к файлу конфигурации и подключению к следующему модулю, который будет настроен. Для подключения просто бесполезно создавать и уничтожать его все время, но для файла конфигурации изменяются во время настройки может привести к неопределенному поведению.
Исследования / подходы:
Я пытался использовать переменные класса, однако они не передаются при инициализации
новый объект модуля.
Кроме того, я пытался использовать глобальные переменные, но так как родительский класс и
дочерние классы находятся в разных файлах, это не сработает (да, я могу поставить их
все в одном файле, но это будет беспорядок) Также с помощью функции получения из
файл, в котором я определил глобальную переменную, не работал.
Мне известно о «встроенном» решении от
Как сделать кросс-модульную переменную?
переменная, но чувствую, что это будет немного излишним ...
Наконец, я могу сохранить файл конфигурации и соединение в центральном
сценарий и передать их каждому экземпляру, но это приведет к загрузке
зависимостей, и я не думаю, что это хорошее решение.
Итак, здесь приведен фрагмент кода с примером метода для получения путей к файлам.
Код настроен в соответствии с подходом 1 (переменные класса)
Пример файла конфигурации:
Files:
Core:
Backend:
- 'file_1'
- 'file_2'
Local:
File_path:
Backend: '/the/path/to'
Родительский класс в setup_class.py
import os
import abc
import yaml
class setup(object):
__metaclass__ = abc.ABCMeta
configuration = []
def check_for_configuration(self, config_file):
if not self.configuration:
with open(config_file, "r") as config:
self.configuration = yaml.safe_load(config)
def get_configuration(self):
return self.configuration
def _make_file_list(self, path, names):
full_file_path = []
for file_name in names:
temp_path = path + '/' + file_name
temp_path = temp_path.split('/')
full_file_path.append(os.path.join(*temp_path))
return full_file_path
@abc.abstractmethod
def install(self):
raise NotImplementedError
Класс модуля в module_class.py
from setup_class import setup
class module(setup):
def __init__(self, module_name, config_file = ''):
self.name = module_name
self.check_for_configuration(config_file)
def install(self):
self._backend()
def _backend(self):
files = self._make_file_list(
self.configuration['Local']['File_path']['Backend'],
self.configuration['Files'][self.name]['Backend'])
if files:
print files
И, наконец, тестовый скрипт:
from module_class import module
Analysis = module('Analysis',"./example.yml")
Core = module('Core', "./example.yml")
Core.install()
Теперь при запуске кода файл конфигурации загружается каждый раз, инициируется новый объект модуля. Я хотел бы избежать этого. Есть ли подходы, которые я не рассматривал? Какой самый лучший способ добиться этого?