Подпараметры Python ArgParse и связывание с правильной функцией

I Я создаю небольшой скрипт Python для управления различными классами серверов (FTP, HTTP, SSH и т. д.)

На каждом типе сервера мы можем выполнять различные типы действий (развертывание, настройка, проверка и т. д.)

У меня есть базовый класс Server , а затем отдельный класс для каждого типа сервера, который наследуется от этого:

class Server:
    ...
    def check():
        ...

class HTTPServer(Server):
    def check():
        super(HTTPServer, self).check()
        ...
class FTPServer(Server):
    def check():
        super(FTPServer, self).check()
        ...

Пример командной строки может быть:

my_program deploy http

Из командной строки два обязательные аргументы, которые мне нужны:

  1. Oper действие для выполнения
  2. Тип сервера для создания / управления

Раньше я использовал argparse и операцию store , а также использовал dict для сопоставьте параметр командной строки с фактическим именем класса и функции. Например:

types_of_servers = {
    'http': 'HTTPServer',
    'ftp': 'FTPServer',
    ...
}

valid_operations = {
    'check': 'check',
    'build': 'build',
    'deploy': 'deploy',
    'configure': 'configure',
    'verify': 'verify',
}

(В моем реальном коде valid_operations не было наивным отображением 1: 1.)

А затем использование довольно ужасного кода для создания объекта правильного типа и вызова правильного класса.

Тогда я решил использовать для этого функцию argparse subparsers . Итак, я сделал каждую операцию (проверка, сборка, развертывание и т. Д.) В подпарсере .

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

Есть ли хороший или питонический способ сделать это? Предпочтительно тот, который не требует большого количества жесткого кодирования или плохо спроектированных циклов if / else?

6
задан rypel 21 May 2013 в 11:18
поделиться