python
  • argparse
  • default-value
  • 2017-06-14 27 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 
    
    相关问题