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
Из командной строки два обязательные аргументы, которые мне нужны:
Раньше я использовал 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?