Je crée un petit script Python pour gérer les différentes classes de serveurs (FTP, HTTP, SSH, etc.)Python argparse Subparsers et un lien vers la fonction correcte
Sur chaque type de serveur, nous pouvons effectuer différentes types d'actions (déployer, configurer, vérifier, etc.)
J'ai une base Server
classe, puis une classe distincte pour chaque type de serveur qui hérite de ceci:
class Server:
...
def check():
...
class HTTPServer(Server):
def check():
super(HTTPServer, self).check()
...
class FTPServer(Server):
def check():
super(FTPServer, self).check()
...
une ligne de commande exemple pourrait être:
my_program deploy http
De la ligne de commande, les deux arguments obligatoires dont j'ai besoin sont:
- opération à effectuer
- Type de serveur pour créer/gérer
Auparavant, j'utilisais argparse
et l'opération store
et en utilisant un dict
pour faire correspondre l'option de ligne de commande au nom de classe et de fonction réel. Par exemple:
types_of_servers = {
'http': 'HTTPServer',
'ftp': 'FTPServer',
...
}
valid_operations = {
'check': 'check',
'build': 'build',
'deploy': 'deploy',
'configure': 'configure',
'verify': 'verify',
}
(Dans mon code actuel, valid_operations était pas tout à fait un 1 naïf: 1 cartographie.)
Et puis en utilisant le code plutôt horrible de créer le type d'objet, et appeler le bonne classe.
Ensuite, j'ai pensé que j'utiliserais la fonctionnalité subparsers
d'argparse pour le faire à la place. J'ai donc fait chaque opération (vérifier, construire, déployer, etc.) un subparser.
Normalement, je pourrais lier chaque sous-commande à une fonction particulière, et l'appeler. Cependant, je ne veux pas simplement appeler une fonction générique check()
- Je dois créer le type d'objet correct d'abord, puis appeler la fonction appropriée dans cet objet.
Existe-t-il une bonne façon de faire cela? De préférence celui qui n'implique pas beaucoup de hardcoding, ou des boucles if/else mal conçues?
Avez-vous essayé [Tissu] (http://fabfile.org/) - outil de ligne de commande pour rationaliser l'utilisation de SSH pour le déploiement d'applications ou les tâches d'administration de systèmes? – jfs