Я создаю небольшой скрипт на 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.)
А затем использование довольно ужасного кода для создания правильного типа объектаи позвоните нужному классу.
Тогда я подумал, что вместо этого буду использовать функцию subparsers
в argparse.Итак, я сделал каждую операцию (проверку, сборку, развертывание и т. Д.) Подпарапером .
Обычно я мог связать каждую подкоманду с определенной функцией и вызвать ееЭто.Однако я не хочу просто вызывать обобщенную функцию check()
- мне нужно создать правильный тип объекта сначала , а затем вызвать соответствующую функцию внутри этого объекта.
Есть ли хороший или питонный способ сделать это?Желательно тот, который не требует много жесткого кодирования или плохо спроектирован, если / иначе зацикливается?