2

argparseを使用して、さまざまなタイプの社内サーバーを管理するための単純なPythonプログラムがあります。

manage_servers.py <operation> <type_of_server> 

操作とは、チェック、ビルド、デプロイ、構成、検証などです。

サーバーの種類は、私たちが使用する社内サーバーの種類とは異なります。

汎用サーバークラスがあり、それを継承する特定のタイプがあります。

class Server
    def configure_logging(self, loggin_file):
        ...
    def check(self):
        ...
    def deploy(self):
        ...
    def configure(self):
        ...
    def __init__(self, hostname):
        self.hostname = hostname
        logging = self.configure_logging(LOG_FILENAME)
class SpamServer(Server):
    def check(self):
        ...
class HamServer(Server):
    def deploy(self):
        ...

私の質問は、それをすべてargparseにリンクする方法です。

もともと、私は操作(チェック、ビルド、デプロイ)にargparseサブ解析を使用し、型に別の引数を使用していました。

subparsers = parser.add_subparsers(help='The operation that you want to run on the server.')
parser_check = subparsers.add_parser('check', help='Check that the server has been setup correctly.')
parser_build = subparsers.add_parser('build', help='Download and build a copy of the execution stack.')
parser_build.add_argument('-r', '--revision', help='SVN revision to build from.')
...
parser.add_argument('type_of_server', action='store', choices=types_of_servers,
                    help='The type of server you wish to create.')

通常、各サブ解析をメソッドにリンクしてから、type_of_serverを引数として渡します。ただし、クラスが原因で少し逆になります。適切なServerクラスのインスタンスを作成してから、その内部で操作メソッドを呼び出す必要があります。

上記をどのように達成できるかについてのアイデアはありますか?おそらく、サーバーの異なるデザインパターンですか?または、argparseをそのまま使用する方法はありますか?

乾杯、ビクター

4

1 に答える 1

2

クラスparser.add_subparsers(dest=...へのマッピングで引数を使用するだけです。type_of_server

subparsers = parser.add_subparsers(dest='operation', help='The operation that you want to run on the server.')
...
server_types = dict(spam=SpamServer, ham=HamServer)
args = parser.parse_args()
server = server_types[args.type_of_server]()
getattr(server, args.operation)(args)
于 2011-08-20T22:26:11.910 に答える