python
  • argparse
  • default-value
  • 2017-06-14 89 views 2 likes 
    2

    當模塊optparse用於獲取所有默認值,然後我就可以得到所有默認值所有命令行參數如下:的Python:如何從argparse

    import optparse 
    
    if __name__ == '__main__': 
        parser = optparse.OptionParser(usage='pokus --help') 
        parser.add_option("-d", "--debug", action='store_true', dest="debug", 
             default=False, help='Enabling debugging.') 
        options, args = parser.parse_args() 
        print(parser.defaults) 
    

    由於optparse被棄用這是明智的改寫您的代碼使用​​模塊。但是我找不到任何方式如何獲得的加入解析器對象的所有命令行參數所有默認值:

    import argparse 
    
    if __name__ == '__main__': 
        parser = argparse.ArgumentParser(usage='pokus --help') 
        parser.add_argument("-d", "--debug", action='store_true', dest='debug', 
             default=False, help='Enabling debugging.') 
        args = parser.parse_args() 
        # <---- How to get default values for all arguments here? 
        # Not: vars(args) 
    

    我想,當我運行程序與(./app.py -d)來獲取所有缺省值或不帶任何命令在線參數(./app.py)。

    +0

    的默認值設置的'當省略開關時,args對象。你需要訪問這些用於其他任何東西嗎? –

    +1

    所以在你的例子中,當你不用'-d'運行程序時,'args.debug'被設置爲'False'。當你用'-d'運行時,你需要知道默認的用法是'False'? –

    +0

    你有沒有考慮過使用['docopt'](http://docopt.org/)? – pylang

    回答

    2

    如果你沒有想分析一個空的輸入字符串,你可以在parser對象使用的方法get_default

    import argparse 
    
    if __name__ == '__main__': 
        parser = argparse.ArgumentParser(usage='pokus --help') 
        parser.add_argument("-d", "--debug", action='store_true', dest='debug', 
             default=False, help='Enabling debugging.') 
        args = parser.parse_args() 
    
        # To get a single default: 
        d_default = parser.get_default('d') 
    
        # To get all defaults: 
        all_defaults = {} 
        for key in vars(args): 
         all_defaults[key] = parser.get_default(key) 
    
    +0

    感謝您的回答。這似乎也是一個可行的解決方案。 – JiriHnidek

    3

    我找到了解決辦法:

    import argparse 
    
    if __name__ == '__main__': 
        parser = argparse.ArgumentParser(usage='pokus --help') 
        parser.add_argument("-d", "--debug", action='store_true', dest='debug', 
             default=False, help='Enabling debugging.') 
        parser.add_argument("-e", "--example", action='store', dest='example', 
             default="", help='Example of argument.') 
        # Arguments from command line and default values 
        args = vars(parser.parse_args()) 
        # Only default values 
        defaults = vars(parser.parse_args([])) 
    

    然後你就可以比較argsdefaults值和命令行的默認值和值區分。

    1

    爲了您的信息,這裏的代碼,在解析的初始化的開始defaults

    def parse_known_args(...): 
        .... 
        # add any action defaults that aren't present 
        for action in self._actions: 
         if action.dest is not SUPPRESS: 
          if not hasattr(namespace, action.dest): 
           if action.default is not SUPPRESS: 
            setattr(namespace, action.dest, action.default) 
    
        # add any parser defaults that aren't present 
        for dest in self._defaults: 
         if not hasattr(namespace, dest): 
          setattr(namespace, dest, self._defaults[dest]) 
        ... 
    

    所以它遍歷parser._actions列表,收集action.default屬性。 (actionAction類對象,由parser.add_argument方法創建)。它還檢查self._defaults。這是由parse.set_defaults方法修改的字典。這可以用來設置不直接鏈接到動作的defaults

    解析所述命令行後,在該命名空間的默認字符串可以被評估(帶有action.type),車削,例如default='1'成整數默認值1

    處理在​​是不平凡的。您的parse_args([])可能是最簡單的,只要解析器可以正常使用(即沒有任何必需的參數)。

    我現在不知道optparse設置了defaults屬性。有一個非trival方法,optparse.OptionParser.get_default_values

    0

    對於上面的例子:

    import argparse 
    
    if __name__ == '__main__': 
        parser = argparse.ArgumentParser(usage='pokus --help') 
        parser.add_argument("-d", "--debug", action='store_true', dest='debug', 
            default=False, help='Enabling debugging.') 
    

    A.要獲得一個tuple格式都擁有各自的默認值:

    In[1]: args = parser.parse_known_args()[0] 
    In[2]: args._get_kwargs() 
    Out[1]: [('debug', False)] 
    

    來訪問每個項目:

    In[3]: args.debug 
    Out[2]: False 
    

    B.要獲得的價值和其默認爲dictionary格式

    In[4]: dict_args = parser.parse_known_args()[0].__dict__ 
    In[5]: dict_args 
    Out[3]: {'debug': False} 
    

    並訪問每個鍵:

    In[6]: dict_args['debug'] 
    Out[4]: False 
    

    或者反覆打印出來:

    In[7]: for key in dict_args: 
    ...  print('value for %s is: %s'% (key, dict_args[key])) 
    
    Out[5]: value for debug is: False 
    
    相關問題