tworzę mały skrypt Pythona do zarządzania różnych klas serwerów (HTTP, FTP, SSH, etc.)Python ArgParse Subparsers i linkami do prawidłowego działania
na każdym typie serwera, możemy wykonać inny rodzaje działań (wdrożenie, konfigurację, sprawdź, etc.)
mam baza Server
klasę, a następnie oddzielną klasę dla każdego typu serwera, która dziedziczy z tego:
class Server:
...
def check():
...
class HTTPServer(Server):
def check():
super(HTTPServer, self).check()
...
class FTPServer(Server):
def check():
super(FTPServer, self).check()
...
linia komend próbka może być:
my_program deploy http
Z linii poleceń, dwa obowiązkowe argumenty muszę to:
- Operation wykonywać
- typ serwera, aby utworzyć/zarządzać
Wcześniej używałem argparse
i operacji store
i za pomocą dict
dopasować opcję wiersza polecenia do rzeczywistej klasy i nazwy funkcji. Na przykład:
types_of_servers = {
'http': 'HTTPServer',
'ftp': 'FTPServer',
...
}
valid_operations = {
'check': 'check',
'build': 'build',
'deploy': 'deploy',
'configure': 'configure',
'verify': 'verify',
}
(W moim rzeczywisty kod, valid_operations nie było dość naiwny mapowanie 1: 1).
A następnie przy użyciu raczej straszny kod stworzyć odpowiedni rodzaj obiektu i wywołać właściwa klasa.
Potem pomyślałem, że zamiast tego użyję funkcji argparse'a subparsers
. Dlatego wykonałem każdą operację (sprawdzenie, zbudowanie, wdrożenie, itd.), A następnie subparser.
Normalnie mógłbym połączyć każde pod-polecenie z konkretną funkcją i zlecić jej wywołanie. Jednak nie chcę po prostu wywoływać ogólnej funkcji check()
- potrzebuję utworzyć prawidłowy typ obiektu najpierw, a następnie wywołać odpowiednią funkcję w obrębie tego obiektu.
Czy istnieje dobry, czy pythonic sposób to zrobić? Najlepiej taki, który nie wymaga dużo twardego kodu lub źle zaprojektowanego pętli/else?
próbowałeś [tkaniny] (http://fabfile.org/) - narzędzie wiersza polecenia do usprawnienia korzystania z SSH do wdrażania aplikacji lub zadań administracyjnych systemu? – jfs