2011-11-29 16 views
7

外の変数を抽出します。Pythonの:私はコマンドライン引数を解析するpythonでargparseを使用している名前空間

parser = ArgumentParser() 
parser.add_argument("--a") 
parser.add_argument("--b") 
parser.add_argument("--c") 
args = parser.parse_args() 

は、今私はab、およびcでいくつかの計算をしたいです。しかし、私はいつもargs.a + args.b + args.cと書くのは面倒です。

したがって、私はこれらの変数を抽出している:私はa + b + cを書くことができます

a, b, c = [args.a, args.b, args.c] 

このようなことを。

もっとエレガントな方法がありますか?

多くの引数を追加すると、手動抽出が非常に面倒でエラーが発生しやすくなります。

答えて

8

の値とローカルスコープにあるaになりますあなたがグローバルとしてそれらをしたい場合は、あなたが行うことができます:

globals().update(vars(args)) 

あなたが」機能的に再と次のようにあなたは、Python 2.xの中でこれを行うことができ、その関数のローカル変数としてそれらをしたい:

def foo(args): 
    locals().update(vars(args))  
    print a, b, c 
    return 
    exec "" # forces Python to use a dict for all local vars 
      # does not need to ever be executed! but assigning 
      # to locals() won't work otherwise. 

このトリックはexec文ではないのPython 3で動作しません、 Jythonのような他のPythonの亜種またはIronPython。

全体的には、argsオブジェクトの名前を短くするか、クリップボードを使用することをお勧めします。 :-)

+0

答えをありがとう。 それは動作しますが、 'exec '"部分は非常に醜いハックのように感じます。それはなぜ必要なのですか? – Lemming

+0

訂正:関数に入れ子関数が含まれていると機能しません。この場合、次のエラーメッセージが表示されます。 'exec" " SyntaxError:正規化されていないexecが関数 'main'に許可されていません。空変数 ' – Lemming

+0

Ickを持つネストされた関数が含まれています。私はそれを知らなかったが、理にかなっている。クロージャーにはPythonの標準ローカル変数機構が必要です。これはローカルでインデックスにアクセスします。関数のどこでも 'exec'文を使うと、' exec'がローカルを定義したり修正したりすることができるため、Pythonは地方自治体に名前でアクセスする代わりの方法を使用します(exec()の場合は 'locals 'は関数内で見られますが、そうでない場合はありません)。 – kindall

0

locals()を呼び出して、ローカルスコープに追加することができます。現在利用可能なスコープを表す辞書を返します。あなたは同様にそれに値を割り当てることができます - locals()['a'] = 12は12

+0

'locals()'の戻り値は変更しないでください。効果があることは保証されておらず、通常はCPythonにはありません。 http://docs.python.org/library/functions.html#locals –

+0

これは 'exec" "トリックがないとうまくいかないようです。 – Lemming

関連する問題