1

次の NameSpace を提供する argparse を使用してスクリプトをセットアップしました。

Namespace(action='list', input='all', target='domain')

ポジショナルに従って呼び出されるいくつかの関数を作成しましたが、現時点では、次のようなコードの宣伝文でそれらを呼び出すことで動作状況を確認しています。

if args.action == 'list':
    if len(sys.argv) == 2:
        parser.print_help()
        sys.exit(0)
elif args.target == 'domain':
    domain_list()
elif args.target == 'forwarding':
    forwarding_list()
elif args.target == 'transport':
    transport_list()
elif args.target == 'user':
    user_list()
else:
    all_list()

これは、これよりもはるかに優れた方法で実行できることを私は知っています。しかし、私のPythonに関する知識が限られているため、これを理解できないようです。

要約:可能であれば、次のようなものが欲しい(疑似コード)

if args.action == 'add':
    target = args.target
    target_add()

のようなものはどこtarget_add()ですかdomain_add()

前もって感謝します!

4

1 に答える 1

0

アクションはまたはである可能性がありますが、、、、、listまたはaddであるtarget可能性がdomainあります。はい、オプションの各組み合わせが何をするかを手動でリストする必要がある場合は、多くのコードが必要になります。forwardingtransportuserif..then..else

これを単純化する方法は次のとおりです。

  • itertools.productを使用して、オプションの可能なすべての組み合わせを生成します。
  • ホワイトリストディスパッチdictを使用して、オプションを関数にマップします。キーは、、、などの2タプル('domain','list')です('transport','add')。値は関連する関数オブジェクトです。

import itertools as IT

targets = 'domain forwarding transport user'.split()
actions = 'list add'.split()

dispatch = {key:globals()['%s_%s' % key] for key in IT.product(targets, actions)}

# This calls the function specified by (target, action).
# The `dict.get` method is used so that if the key is not in `dispatch`, the `all_list` function is called.
dispatch.get((args.target, args.action), all_list)()
于 2012-12-31T13:28:46.623 に答える