python
  • parsing
  • dictionary
  • import
  • argparse
  • 2013-11-29 42 views 3 likes 
    3

    我有一個argparsing程序:如何檢查併發出錯誤沒有命令行參數

    進口argparse

    def main(): 
        p = argparse.ArgumentParser() 
        help_str = {'rule': 'Blah blah blah and stuff.'} 
        p.add_argument('-r', '--rule', action="store", type=str, dest='rule', help=help_str['rule']) 
        p.set_defaults(rule='string') 
        args = p.parse_args() 
    

    因此,我的命令行輸入:

    [email protected]:~$python progname.py -r/--rule 'something' 
    

    我我試圖弄清楚我怎樣才能輸入:

    [email protected]:~$python progname.py -r/--rule 
    

    和有我自己的錯誤信息上來:

    print '\n Error: no input value for rule:' 
    print ' resetting rule to default value.' 
    args.rule = 'string' 
    

    在此之後,該規則值應打印出「字符串」

    我只是稍微精通Python的,對不起。我嘗試過使用try/except塊,甚至是sys.argv [2](儘管我可能做錯了什麼)。這是我的所有解決方案都不斷彈出的錯誤(不太熟悉Type和Value之外的錯誤) :

    progname.py: error: argument -r/--rule: expected one argument 
    

    任何幫助表示讚賞。

    +0

    nvrmnd,解決了這個問題 – user2998514

    回答

    1
    p = argparse.ArgumentParser() 
    p.add_argument('-r', '--rule', nargs='?', default='string') 
    args = p.parse_args() 
    print args 
    

    nargs='?'產生Namespace(rule='string')如果調用沒有參數。用-r,參數是Namespace(rule=None)。並且Namespace(rule='something')-r something

    允許添加的代碼

    if args.rule is None: 
        print '\n Error: no input value for rule:' 
        print ' resetting rule to default value.' 
        args.rule = 'string' 
    print args 
    

    幾行現在用 '-R'(或--rule)的輸出是:

    Namespace(rule=None) 
    
        Error: no input value for rule: 
        resetting rule to default value. 
    Namespace(rule='string') 
    

    在其他情況下是相同的。

    如果我放棄default; p.add_argument('-r', '--rule', nargs='?'),由於缺省值(在argparse中)爲None,所以沒有參數的情況下也會產生這個定製的'錯誤消息'。

    它可以添加自定義錯誤與自定義typeaction檢查,但使用​​更簡單,更容易理解後,我覺得測試爲None

    我建議將error message更改爲warning。錯誤通常會終止程序;警告會打印該消息並繼續。


    這是nargs=2(或其他固定的東西)的解決方案。這不是微不足道的變化,因爲它涉及重新定義error方法(記錄在​​文檔末尾附近),然後捕獲它產生的錯誤。 error方法無法訪問名稱空間(參數),也不能繼續parse_args。因此,如果rule參數存在問題,則無法處理任何其他參數。

    class MyParser(argparse.ArgumentParser): 
        def error(self, message): 
         if 'rule' in message: 
          message = 'wrong number of input values for rule' 
          raise argparse.ArgumentError(None,message) 
          # cannot access namespace or continue parsing 
         else: 
          super(MyParser, self).error(message) 
    
    p = MyParser() 
    p.add_argument('-r', '--rule', nargs=2) 
    try: 
        args = p.parse_args() 
    except argparse.ArgumentError as e: 
        print e 
        args = argparse.Namespace(rule='default') 
        # create a namespace with this default value 
    print args 
    

    記住nargs有2個目的: - 如果參數字符串的一個錯誤的號碼被賦予 引發一個錯誤 - 分配多個操作中的多個參數字符串(由add_argument創造的東西)。

    第二個特別明顯,例如,如果您有幾個參數,分別取1,2和*參數。這是argparse的一個重要的新功能,至少與早期的Python解析器相比。雖然可以調整它,但很難完全重新定義它。

    如果參數允許,您可以使用nargs='*'而不是'?',如果字符串的數量不是'2'(或其他),則發出警告。

    +0

    謝謝,這讓我瘋狂。如果你已經有了一個必要的數值的narg語句?有沒有解決方法? – user2998514

    +0

    我添加了一個重新定義'parser.error'方法的部分解決方案。 – hpaulj

    相關問題