2012-05-22 48 views
30

當給出no參數時,我的腳本應該啓動演示模式。我嘗試這樣做:Argparse:檢查是否有任何參數已通過

args = parser.parse_args() 
if len(args) == 0: 
    run_demo() 
else: 
    # evaluate args 

這給*** TypeError: object of type 'Namespace' has no len()args是沒有列表。

我將如何實現我想要的?

+0

嘗試使用除了捕獲類型錯誤,所以你知道,沒有什麼已經過去了 – avasal

+7

@avasal,'LEN(參數)'總是拋出一個TypeError。 – huon

回答

50

如果你的目標是檢測沒有參數已經給命令,那麼通過​​這樣做是錯誤的方法(正如Ben指出的那樣)。

認爲簡單! :-)我相信,argparse不會減少sys.argv。所以,if not len(sys.argv) > 1,那麼用戶沒有提供任何參數。

+0

它的工作原理,它可能是更好/最簡單的方法來做到這一點:D –

+0

接受此答案,因爲它解決了我的問題,我不得不重新考慮一些事情。 =>壞我;) – Framester

+0

+1對於手頭的問題,比我的建議檢查*所有*選項針對'無'更實用的建議。 – Ben

14

argparse可以根據您的規範和命令行解析來設置(在Namespace對象中)在添加到解析器中的參數中提到的所有變量。如果您設置了默認值,那麼這些變量將具有該默認值(如果它們未在命令行中看到),則它們不會從命名空間對象中缺失。如果你不要指定一個默認值,那麼有一個隱含的默認值None。因此,檢查名稱空間對象的長度(無論您是否設法執行此操作),作爲檢查是否解析任何參數的方式沒有任何意義;它應該始終具有相同的長度。

相反,如果你知道你有一堆沒有默認值的參數,並且你想檢查它們中的任何一個是否被設置爲任何非None的值...那麼做。如Martijn的回答所示,您可以使用列表理解和vars函數來遍歷它們,而不必複製add_argument調用中的名稱列表。

如果你的一些參數具有默認值,那麼它會變得有點麻煩,如果它們具有可以在命令行上明確提供的默認值(例如,默認值爲0的數字參數使得不可能告訴來自提供0的用戶的默認值)。在那種情況下,我不確定是否有一個通用解決方案總是在不知道參數是什麼的情況下工作。

+2

這很好地解釋了爲什麼你有一個'錯誤的問題':) –

+0

+1的洞察力 – Framester

4

如果確實需要參數號(無論出於何種原因)。 我發現這段代碼非常有幫助(但不知道它有多少優化,我會很感激任何評論)。

args = parser.parse_args() 
print(len(vars(args))) 

該版本只計算-xx參數,不傳遞任何附加值。

如果您想要一切(也是通過的值),那麼只需使用len(sys.argv),如前所述。

0

我擴大2dvisio的概念來算不爲零或無參數:

vm_opts = parser.parse_args() 
v = vars(vm_opts) 
n_args = sum([ 1 for a in v.values() if a]) 
1

讓我們假設下面的例子來擴展此致的完整性:

#!/usr/bin/env python3 

import argparse 

... 
def main(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('input', nargs='?' action='store') 
    parser.add_argument('-l', '--length', type=int, action='store') 
    parser.add_argument('-v', '--verbose', action='store_true') 
    args = parser.parse_args() 
    if (args.input == None and args.length == None): 
     parser.print_help() 
    else: 
     print(args) 

if __name__ == '__main__': 
    main() 

你Namespace對象,通過@Ben提到,在這個例子中是args。從parser.add_argument中的字符串創建一個變量。您可以通過args.inputargs.lengthargs.verbose訪問它。你可以通過執行print(args)驗證這一點,這將實際顯示是這樣的:

Namespace(input=None, length=None, verbose=False) 

因爲冗長的設置爲True,如果存在與輸入和長度都只是變量,不必被實例化(沒有參數提供)。

同樣有用的可以是group = parser.add_mutually_exclusive_group()如果你想確保兩個屬性不能同時提供。

更多參考,請查閱:

0

不要argparse使用。而只是使用sys.argv。​​創建一個名稱空間,所以它總會給你一個「字典」的值,這取決於你調用腳本時使用的參數。

這是我在過去所做的那樣:

args = parser.parse_args() 
if len(sys.argv) == 1: 
    parser.print_help() 
    sys.exit() 
return args 
相關問題