10

私は主に Python でコマンドライン スクリプトを作成するために argparse を使用してきました。私が一般的に使用するイディオムは、引数をオブジェクトの属性として割り当ててから、それらを個別に解析して、その属性名に一致する変数にするというものです。これは少し繰り返しのようです。それらすべてをグローバル名前空間に割り当てて、割り当て手順を切り取る方法はありますか? または、Pythonの動作が直感に反するように見える場合によくあることですが、賢明なPythonの専門家は、これを行うべきではない、またはこれを行いたいという正当な理由があることを指摘できますか?

私が今持っているのはこれです:

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--db",type=str, dest='db', nargs='?', default="test")
    parser.add_argument("--collection",type=str, dest='collection', nargs='?', help="Collection, default is test", default="test")
    args = parser.parse_args()
    db = args.db                   # gross! 
    collection = args.collection   # yuck!
    print(db)
    print(collection)

これが欲しいのは:

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--db",type=str, dest='db', nargs='?', default="test")
    parser.add_argument("--collection",type=str, dest='collection', nargs='?', help="Collection, default is test", default="test")
    parser.SUPER_parse_args() # now, db and collection are already in the namespace!
    print(db)
    print(collection)

引数が 2 つしかない場合はそれほど多くないように思えますが、10 個程度の場合、args オブジェクトに既に存在する属性の名前をグローバル名前空間に変更する割り当て手順を 2 倍にすると、バグが発生し始めます。

4

3 に答える 3

10

次を使用してこれを行うことができglobalsます。

globals().update(args.__dict__)

しかし、あなたは本当にそうすべきではありません。パイソンの禅から、

名前空間は素晴らしいアイデアの 1 つです。もっと多くのことをしましょう!

@Martijn がコメントで言ったことを繰り返します。

しないでください。ただしないでください。args代わりに直接使用します。

できるだけきれいに分けて保管してください。これにより、コードの保守が容易になり、理解しやすくなります。

于 2013-10-10T15:29:27.697 に答える
0

mgilsonの答えに追加するには:

locals().update(args.__dict__)代わりに使用することを検討してください。これにより、グローバル名前空間ではなく現在の名前空間が更新されます。

locals() または vars() を使用してこれを行うこともできます。この2 つの違いに関する適切な説明については、このスタック オーバーフローの投稿を参照してください。

ミトンチョップには少し遅れていますが、これが他の人の助けになることを願っています.

于 2015-01-28T21:47:27.523 に答える