2012-01-25 2 views
1

Я пишу конфигурационную программу для своего собственного дистрибутива Linux. Конфигурация разделена на разделы: general, networking, session, etc. - которая группирует аналогичные параметры. Например. в разделе общие есть компьютеры name, description, workgroup, language опций.Классы для группировки некоторых действий в Python

Я думаю, что каждый раздел должен быть представлен классом, и каждый вариант должен иметь соответствующее свойство (getter и, возможно, setter).

Кроме того, было бы неплохо для обобщения, есть ли функция, чтобы проверить, если данная опция включена (т.е. если система удовлетворяет требования для данного варианта), а именно:

class General(object): 

    @property 
    def name(self): 
     return self.get_computer_name() 

    @name.setter 
    def name(self, name): 
     self.set_computer_name(name) 

    def is_option_enabled(self, option): 
     return True_or_False 

Что еще мне нужно эти варианты (и разделы) ссылку вместе с соответствующим переведенным именем и описанием (с использованием gettext).

Я знаю, что уровень жесткого кодирования в классах не является хорошей идеей ... Мне нужно что-то вроде шаблона проектирования, общей идеи/шаблона, как реализовать это, чтобы оно было высокого качества, легко управляться и расширяться.

Я собираюсь создать несколько передних концов для этих классов (текст, gui, web), поэтому я не хочу, чтобы каждый раз повторял тот же код.

Я имею в виду очень трудно, но, к сожалению, я не знаю, как это сделать, или есть какие-то сомнения ...

Спасибо :)

+0

Считаете ли вы использование [configparser] (http://docs.python.org/py3k/library/configparser.html)? –

+0

Не совсем ... зачем? Но я напишу программу для импорта и применения/экспорта этих параметров из формата JSON. – marcinpz

+0

Чтобы импортировать/экспортировать конфигурацию в файл, это первое, что мне пришло в голову, я никогда не использовал json, но он поддерживается в std-lib, поэтому я думаю, что это то же самое. –

ответ

1

Я бы сказал, что ваш проект выглядит амбициозный.

И использование класса для каждого раздела для меня не кажется хорошей идеей, потому что в основном это означает, что добавление, удаление или изменение разделов потребует изменений кода, это не динамический и подразумевает выпуск нового версия, не поддающаяся предыдущему.

Было бы лучше, если бы каждый раздел обрабатывался одинаково.

Для ядра я думаю, что вам нужно:

  1. Защищенный файл с объявлением приемлемых секций и параметров
  2. -пустышку конфигурации с доступом к такому файлу.
  3. погрузчик для ваших конфигурационных файлов:
    • Чтение/разобрать ваш конфигурационный файл.
    • Создайте свой держатель конфигурации.
  4. Команды с доступом к вашему держателю конфигурации:
    • Абстрактное BaseCommand, который реализует этот доступ,
    • подклассы для каждой реальной команды: Get, Add, Remove.

Затем каждые передние концы будут только интерфейс для этих команд.

+0

Благодарим вас за разъяснения. Должен сказать, что я думал о создании плагируемой системы [Yapsy] (http://yapsy.sourceforge.net/) неплохо). Добавление файла конфигурации (ini или JSON) для диспетчера плагинов даст мне возможность включить/отключить определенный плагин. Итак, в заключение: создайте класс команд и плагинов для каждого действия и настраиваемый PluginManager, который найдет эти плагины и активирует их в соответствии с конфигурационным файлом. Будет ли это хорошо? – marcinpz

+0

@marcinpz: Если вы не знаете, как это сделать, возможно, вы хотите задать новый более общий вопрос и задать направление. Прежде чем начинать код, вы должны действительно завершить свой проект. В любом случае, я думаю, что я не буду настраивать свою конфигурацию системы, но только ее интерфейсы, я думаю, что также будут подмножества conf-информации для передачи другим частям системы или другим приложениям. –

+0

Да У вас есть право. Только gui должен быть подключаемым, и некоторые конфигурации должны существовать. У меня есть идея, как все должно работать, но все еще есть проблемы с реализацией базовых классов. В любом случае спасибо :) – marcinpz

1

Я предполагаю, что ваши конфигурации строят дерево с узлами существ и конфигурацией листьев.

Учитывая, что установка вы можете представлять 2 глубины глубокой конфигурации, как сети с помощью следующих классов с использованием декларативного API:

class InterfaceConfiguration(Configuration): 
    mask = IPField() 
    dns = IPField() 
    IP = IPField() 
    dhcp = BooleanField() 
    driver = ChoiceField(choices=('madwifi', 'atheros', 'whatever')) 

class NetworkConfiguration(Configuration): 

    eth0 = InterfaceConfiguration(verbose_name='network interface eth0') 
    eth1 = InterfaceConfiguration(verbose_name='network interface eth1') 
    wlan0 = InterfaceConfiguration(verboxe_name='wireless network interface wlan0') 
    hostname = StringField() 
    domain = StringField() 

Этот вид декларативный API достигается metaclasses взглянуть на dictshield и manyORMs и more, который реализует такую ​​функцию.

Учитывая этот набор класса вы могли бы манипулировать ими следующим образом:

>>> configuration = NetworkConfiguration('/path/to/config/file') 
>>> configuration.eth0.verbose_name 
'network interface eth0' 
>>> configuration.eth0.mask.set('192.168.0.255') 
True 
>>> configuration.eth0.driver.choices 
('madwifi', 'atheros', 'whatever') 
>>> configuration.hostname.set('amokrane') 
>>> configuration.domain.set('imazighen') 
>>> configuration.wlan0.dhcp.get_value() 
True 

Этот вид API проще в реализации и не требует специального строительства питона (смотри ниже) и обеспечивают возможность иметь другие методы, кроме get и set.

Если вам не нужны другие методы, кроме get/set, вы можете использовать дескрипторы python для реализации различных типов полей, я рекомендую вам прочитать статью Python attributes and methods о предмете и иметь более глубокие взгляды и приведенные выше ссылки о ORM Python так как это используемый метод.

+0

Мне нравится Ваша идея, но мне нужно читать/записывать эти значения из системы. Например, NetworkConfiguration должен иметь возможность читать/писать интерфейсы из файла/etc/network/interfaces (в Ubuntu). Я не уверен, что просто пишите методы чтения/записи в Configuration и переопределите их в каждом подклассе? Во-вторых, я не уверен, что имя хоста должно принадлежать классу NetworkConfiguration, потому что оно хранится в другом файле ... – marcinpz

+0

1) Я взял пример сетевой конфигурации, где один файл контролирует все аспекты сетевой конфигурации, чтобы показать, как это может быть реализованы.Опишите сложную конфигурацию, которая вам понадобится. Я обновлю пример. – amirouche

+0

write/read обрабатываются базовыми классами через интроспекцию, поэтому вы никогда не пишете новый код для реализации новых файлов конфигураций. Но вы можете написать новый код, если хотите поддерживать новые типы полей. – amirouche