1

コマンドライン引数を解析するargsを呼び出して取得した名前空間があるとします。parser.parse_args()

この名前空間から現在の名前空間にすべての変数をインポートするにはどうすればよいですか?

例えば

parser.add_argument('-p', '--some_parameter', default=1)

args = parser.parse_args()

# ... code to load all variables defined in the namespace args ...

print some_parameter

私は確かにできる:

some_parameter = args.some_parameter

しかし、多数のパラメーターがある場合は、パラメーターごとにそのような行が 1 つ必要になります。

変数を 1 つずつ調べなくても、名前空間から変数をインポートする別の方法はありますか?

PS :from args import *動作しません。

PS2 : これが悪い習慣であることは承知していますが、これは、コードのプロトタイピングやテストを非常に迅速に行う場合など、いくつかのまれなケースで役立つ場合があります。

4

2 に答える 2

4

vars()関数の結果でローカル名前空間を更新します:

globals().update(vars(args))

これは一般的にそれほど素晴らしいアイデアではありません。代わりに、これらの属性を名前空間に残してください。

このアプローチで解決したよりも多くの問題が発生する可能性があります。特に、またはなど、気になる組み込みまたはローカルをシャドウする名前で引数を誤って構成した場合はそうdestですそのバグを探して楽しんでください!listprint

Tim Petersは、PythonのZenですでにこれを述べています。

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

于 2013-02-04T22:51:49.353 に答える
0

おそらくこれまでで最悪のアイデアです。任意のオブジェクトをparse_args()に渡すことができるため、__builtins__モジュールを渡すことで、すべての属性をローカル変数として検索できるようになります。

p = argparse.ArgumentParser()
p.add_argument("--foo")
p.parse_args( "--foo bar".split(), __builtins__)
print foo

これは、宛先が有効な Python 識別子ではないパラメーターに対しても「機能」します。

# To use the example given by Francis Avila in his comment on Martijn Pieters' answer
getattr(__builtins__, '2my-param')
于 2013-02-04T23:08:20.233 に答える