Python:如何从argparse获取所有默认值

Jir*_*dek 3 python default-value argparse

使用module时optparse,我可以像这样获取所有命令行参数的所有默认值:

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)
Run Code Online (Sandbox Code Playgroud)

由于optparse已弃用,明智的做法是重写代码以使用argparse模块。但是我找不到任何方法来获取添加到解析器对象的所有命令行参数的所有默认值:

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)
Run Code Online (Sandbox Code Playgroud)

我想在使用(./app.py -d)或没有任何命令行参数(./app.py)的情况下运行程序时获取所有默认值。

Joh*_*anL 6

如果您不想解析空的输入字符串,则可以get_defaultparser对象中使用方法:

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)
Run Code Online (Sandbox Code Playgroud)


Jir*_*dek 5

我找到了解决方案:

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([]))
Run Code Online (Sandbox Code Playgroud)

然后,您可以比较argsdefaults值,并区分默认值和命令行中的值。


Dav*_*258 5

有点晚了,但这是一个函数(带有额外的单元测试),我在几个案例中使用它来获取默认参数,而不必首先解析(如果您有所需的参数,那么首先解析可能会很烦人)尚未可用)

def get_argparse_defaults(parser):
    defaults = {}
    for action in parser._actions:
        if not action.required and action.dest != "help":
            defaults[action.dest] = action.default
    return defaults

def get_argparse_required(parser):
    required = []
    for action in parser._actions:
        if action.required:
            required.append(action.dest)
    return required

parser = argparse.ArgumentParser()
optional_defaults_dict = get_argparse_defaults(parser)
required_list = get_argparse_required(parser)
Run Code Online (Sandbox Code Playgroud)
class TestDefaultArgs(unittest.TestCase):

    def test_get_args(self):
        parser = argparse.ArgumentParser()
        parser.add_argument('positional_arg')
        parser.add_argument('--required_option', required=True)
        parser.add_argument('--optional_with_default', required=False, default="default_value")
        parser.add_argument('--optional_without_default', required=False)

        required_args = get_argparse_required(parser)
        self.assertEqual(['positional_arg', 'required_option'], required_args)


        default_args = get_argparse_defaults(parser)
        self.assertEqual({'optional_with_default': 'default_value',
                          'optional_without_default': None},
                         default_args)
Run Code Online (Sandbox Code Playgroud)