2017-01-23 96 views
1

我想創建一個腳本,它需要多個相同類型的命令行參數,然後將它們提供給for循環進行處理,下面是我所擁有的在我的代碼:使用parser_args值來提供一個for循環(Python 3.6)

import argparse 

parser = argparse.ArgumentParser(description='XYZ') 
parser.add_argument('[values]', nargs='+', help='A list of values') 

u = parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

for values in u: 
    ... # do a bunch of stuff for each "value" 

我明白,存儲在parse_args的值是一個命名空間,因此,當我跑我的代碼如下錯誤:

TypeError: 'Namespace' object is not iterable 

有沒有辦法把它們放入一個列表目的?以便我可以將它們傳遞給我的for循環,或者是否有其他方法可以使用?剛開始使用python,如果這是一個noob問題,請提前道歉

+0

你想迭代什麼類型的值? –

回答

2

您需要迭代u.values(您在add_argument調用中指定的參數名稱)而不是u本身;要做到這一點,你需要重命名[values]values

import argparse 

parser = argparse.ArgumentParser(description='XYZ') 
parser.add_argument('values', nargs='+', help='A list of values') 
#     ^^^^^^^^ 

u = parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

for value in u.values: 
    #  ^^^^^^^^ 
    # do a bunch of stuff for each "value" 
+0

如果有其他人出現這個問題,請注意,雖然問題標記爲python3.x(並提及python3.6),但此解決方案在python2.7 + –

0

從解析值是argparse.namespace類對象的簡單(可定製 - 見文檔)。

通常您可以通過屬性名稱訪問這些值,例如, args.foo。對於不尋常的名字,你必須使用getattr(args, '[values]')

在簡單情況下,參數值是單個字符串或數字。與nargs像'*'或'+',這些值將在列表中。使用append操作類型,您甚至可以在列表中獲得列表。

我鼓勵用戶打印args命名空間。

In [2]: parser = argparse.ArgumentParser(description='XYZ') 
    ...: parser.add_argument('[values]', nargs='+', help='A list of values').... 
In [3]: args =parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

In [4]: print(args) 
Namespace([values]=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

有了您的「DEST」我必須使用getattrargs獲取字符串列表。

In [5]: getattr(args,'[values]') 
Out[5]: ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'] 

args是一個簡單的對象,這樣你就可以添加屬性或修改現有的。例如周圍這樣的事情一個交互式的Python會話

In [9]: vars(args)['values'] 
Out[9]: ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'] 

播放:

In [6]: args.values = ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'] 
In [7]: print(args) 
Namespace([values]=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'], 
    values=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

如果你比較熟悉的字典,您可以使用vars()