2011-11-29 51 views
7

的我使用argparse在python解析命令行參數:的Python:提取出的變量命名

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

現在我想要做一些計算與abc。但是,我總是發現編寫args.a + args.b + args.c令人厭煩。

因此,我可以從中獲取這些變量:

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

,這樣我可以寫a + b + c

有沒有更優雅的方式呢?

添加許多參數時,手動提取變得非常單調且容易出錯。

回答

8

值是如果你希望他們爲全局變量,你可以這樣做:

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. 

這一招並不在Python 3,其中exec不是一份聲明中工作,在其他Python變體(如Jython)中也不可能或IronPython。總的來說,我會建議僅使用args對象的較短名稱,或者使用剪貼板。 :-)

+0

感謝您的回答。 它的工作原理,但'exec'「'部分感覺像一個非常醜陋的黑客。爲什麼這是必要的? – Lemming

+0

更正:如果函數包含嵌套函數,則不起作用。在這種情況下,彈出以下錯誤消息: 'exec「」 SyntaxError:在函數'main'中不允許使用未限定的exec,它包含一個帶有自由變量的嵌套函數' – Lemming

+0

Ick。我不知道,但它是有道理的。閉包需要Python的標準局部變量機制,它通過索引來訪問局部變量。在函數的任何地方使用'exec'語句都會強制Python使用另一種通過名稱訪問本地名稱的方法,因爲'exec'可以定義或修改locals(這也是爲什麼你可以更新'locals()'如果'exec '在功能中看到,但不是其他)。 – kindall

0

您可以致電locals()將事情添加到本地範圍。它返回一個代表當前可用範圍的字典。您可以將值分配給它,以及 - locals()['a'] = 12將導致a在局部範圍內與12

+0

你不應該修改'locals()'的返回值。不保證有效,通常不會在CPython中。 http://docs.python.org/library/functions.html#locals –

+0

似乎沒有'exec'「'竅門這不起作用,那就好了。 – Lemming