知道

2014-01-16 49 views
4

比方說,我有使用argparse一個Python測試,有幾個參數:知道

  • IP(默認值:127.0.0.1)
  • enabled_features(默認:[A,B,C])

有時候,我想更改默認enabled_features,讓我們爲[A,B,C,d]說:

  • 取決於我需要的IP找出(所以它不可能是一個默認值的方式argparse有默認值)
  • 只有當用戶沒有指定「enabled_features」...這就是我很難知道!

那麼,有沒有在argparse類的屬性就知道了,以後:

opts = parser.parse_args() 

...一場爭論實際上是由用戶指定的,即一個使用了類似:

$ python my_test.py --enabled_features A B C 

,而不是:

$ python my_test.py 

謝謝!

回答

3

opts包含​​可以給你的所有信息。因此,您必須測試某個默認值(最常見的是None),或者不存在該屬性(如果default=argparse.SUPPRESS)。

另一種方法是指定合理的default,而不用擔心用戶是否在輸入中指定了這些值或其他值。哪個更重要,用戶指定了值還是值本身?

+0

我承認更改默認值通常隱含是一個壞主意,並設置默認爲無使它更加明確。 然而,在許多情況下,解析後更改默認值的想法是,如果不是最好的,最明顯的事情...... – Mathias

+0

請注意,所有的值不一定會在默認情況下有沒有一個默認值,如果正在使用諸如store_true之類的操作。 – AdamC

+0

'store_true'默認是'False',這同樣合理。如果命令行可以提供與默認相同的測試值,則只會產生歧義。 – hpaulj

0

喜歡的東西...

myopts = vars(opts) 
if opts['enabled_features'] is None: 
    #Set the default parameters as you please. 

將允許你看看他們指定在命令行中選擇(假設你已經添加了參數解析器)。

+0

對不起,它似乎並沒有工作,無論我所說的那樣,在我們的情況下'OPTS [「enabled_features」]'包含默認值,而不是'如果不是由用戶指定None'它。 .. – Mathias

+0

我想他的意思是說在'add_argument不設置默認值(「enabled_features」)',那麼你可以檢查它是'None'做取決於其他參數複雜的邏輯。 – nos

0

parser object itself保存了一些有用的信息,我們可以使用它們查看添加參數時分配的默認值。

示例腳本parser_ex.py

import argparse 

def specified_nondefault(opts, parser, arg): 
    """ 
    Checks whether an argument was specified to be something other than the 
    default value. 

    ..Note: This doesn't actually check if the argument was specified, as it 
      can be 'tricked' by the user specifying the default value. 

    :param argparse.Namespace opts: Parsed arguments to check. 
    :param argparse.Parser parser: The parser they were parsed with. 
    :param str arg: The name of the argument in question. 
    :return bool: Whether the current argument value differs from the default. 
    """ 

    if getattr(opts, arg) == parser.get_default(arg): 
    return False 
    return True 

parser = argparse.ArgumentParser() 

parser.add_argument('enabled_features', nargs='*', default=['A', 'B', 'C', 'D']) 

opts = parser.parse_args() 

print specified_nondefault(opts, parser, 'enabled_features') 

在這種情況下:

>> parser_ex.py 'B' True

因爲我們已經做了一些非默認。雖然

>> parser_ex.py 'A' 'B' 'C' 'D' False

>> parser_ex.py False

由於這只是有默認輸入。

注意,因爲我們正在檢查針對整個列表,有一些稍微不良行爲的順序問題和

>> parser_ex.py 'B' 'A' 'C' True

IMO,這是結塊的所有功能集成到一個單一的參數有問題,但是如果你在意的話,你肯定可以以某種方式繞過它。

然後,如果用戶已經/未指定不確定enabled_features,您可以根據需要根據IP更改它們。

+0

您正在測試'opts'值與已知的'default'值。你還沒有發現任何在'by'parse_args()'中創建的隱藏信息。該方法不會改變解析器的狀態。 – hpaulj

+0

我編輯前言不太挑釁。 – CaptainKinematics

+0

是的,那正是我正在做的。我的目標是顯示添加參數時創建的默認值的位置(而不是像在CB的答案中那樣明確地假設它是None)。我從來沒有聲稱信息是隱藏的,只是顯示了它的位置被存儲並鏈接相關文檔。我也沒有聲稱改變解析器本身的狀態,我不清楚爲什麼我想要。 – CaptainKinematics