Python: 如何从 argparse 获取所有默认值
Python: How to get all default values from argparse
使用模块 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)
由于 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)
当我 运行 使用 (./app.py -d
) 或不使用任何命令行参数 (./app.py
) 编程时,我想获得所有默认值。
我找到了解决方案:
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([]))
然后您可以比较 args
和 defaults
值并区分默认值和命令行值。
如果不想解析空输入字符串,可以在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)
# Edit: Adding an alternative one-liner (using dict comprehension):
all_defaults = {key: parser.get_default(key) for key in vars(args)}
供您参考,这是在解析开始时初始化 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
属性。 (action
是由 parser.add_argument
方法创建的 Action
class 对象。)。它还会检查 self._defaults
。这是通过parse.set_defaults
方法修改的字典。这可用于设置未直接链接到操作的 defaults
。
解析命令行后,可以评估命名空间中的默认字符串(使用 action.type
),例如将 default='1'
转换为整数 1.
argparse
中默认值的处理并非易事。你的 parse_args([])
可能是最简单的,前提是解析器可以接受(即没有任何必需的参数)。
我现在不知道 optparse
设置了 defaults
属性。有一个非平凡的方法,optparse.OptionParser.get_default_values
.
对于上面的例子:
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
派对有点晚了,但这是一个函数(带有额外的单元测试),我在几个案例中使用它来获取默认参数而不必先解析(如果先解析可能很烦人)您需要的参数尚不可用)
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)
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)
使用模块 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)
由于 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)
当我 运行 使用 (./app.py -d
) 或不使用任何命令行参数 (./app.py
) 编程时,我想获得所有默认值。
我找到了解决方案:
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([]))
然后您可以比较 args
和 defaults
值并区分默认值和命令行值。
如果不想解析空输入字符串,可以在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)
# Edit: Adding an alternative one-liner (using dict comprehension):
all_defaults = {key: parser.get_default(key) for key in vars(args)}
供您参考,这是在解析开始时初始化 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
属性。 (action
是由 parser.add_argument
方法创建的 Action
class 对象。)。它还会检查 self._defaults
。这是通过parse.set_defaults
方法修改的字典。这可用于设置未直接链接到操作的 defaults
。
解析命令行后,可以评估命名空间中的默认字符串(使用 action.type
),例如将 default='1'
转换为整数 1.
argparse
中默认值的处理并非易事。你的 parse_args([])
可能是最简单的,前提是解析器可以接受(即没有任何必需的参数)。
我现在不知道 optparse
设置了 defaults
属性。有一个非平凡的方法,optparse.OptionParser.get_default_values
.
对于上面的例子:
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
派对有点晚了,但这是一个函数(带有额外的单元测试),我在几个案例中使用它来获取默认参数而不必先解析(如果先解析可能很烦人)您需要的参数尚不可用)
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)
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)