さまざまなクラスのサーバー (FTP、HTTP、SSH など) を管理するための小さな Python スクリプトを作成しています。
サーバーの種類ごとに、さまざまな種類のアクション (デプロイ、構成、チェックなど) を実行できます。
基本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
コマンドラインから、必要な 2 つの必須引数は次のとおりです。
- 実行する操作
- 作成/管理するサーバーの種類
以前は、 argparse
andstore
操作を使用し、aを使用し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()
に正しいタイプのオブジェクトを作成してから、そのオブジェクト内で適切な関数を呼び出す必要があります。
これを行うための良い、またはpythonicな方法はありますか? できれば、多くのハードコーディングを含まないもの、または不適切に設計された if/else ループですか?