当前位置: 首页 > 面试题库 >

python argparse-带有选项的可选附加参数

杨腾
2023-03-14
问题内容

我有一个脚本,要求用户提供要执行的预定义动作的列表。我还希望能够在用户未定义任何内容时承担特定的动作列表。但是,似乎无法同时做到这两者。

当用户不提供任何参数时,他们会收到一个错误,表明默认选择无效

acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args([])
>>> usage: [-h] [{clear,copy,dump,lock} [{clear,copy,dump,lock} ...]]
: error: argument action: invalid choice: [['dump', 'clear']] (choose from 'clear', 'copy', 'dump', 'lock')

并且当它们确实定义了一组动作时,结果名称空间会将用户的动作附加到默认值之后,而不是替换默认值

acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args(['lock'])
args
>>> Namespace(action=[['dump', 'clear'], ['dump']])

问题答案:

可以使用argparse.Action以下示例中的定制方法完成所需的操作:

import argparse

parser = argparse.ArgumentParser()

class DefaultListAction(argparse.Action):
    CHOICES = ['clear','copy','dump','lock']
    def __call__(self, parser, namespace, values, option_string=None):
        if values:
            for value in values:
                if value not in self.CHOICES:
                    message = ("invalid choice: {0!r} (choose from {1})"
                               .format(value,
                                       ', '.join([repr(action)
                                                  for action in self.CHOICES])))

                    raise argparse.ArgumentError(self, message)
            setattr(namespace, self.dest, values)

parser.add_argument('actions', nargs='*', action=DefaultListAction,
                    default = ['dump', 'clear'],
                    metavar='ACTION')

print parser.parse_args([])
print parser.parse_args(['lock'])

该脚本的输出为:

$ python test.py 
Namespace(actions=['dump', 'clear'])
Namespace(actions=['lock'])


 类似资料:
  • 下列选项是根据在第一步选择的文件格式而有所不同。 包含列的标题 如果勾选了这个选项,字段名将会包含在导出的文件。 如果零,留空白 如果字段内容是 0,留空白。 追加 将记录追加至现有的文件。 遇到错误时继续 在导出进程中忽略遇到的错误。 在 XML 中使用属性格式 属性格式 <RECORDS> <RECORD OrderNo="1003" ItemNo="1" PartNo="1313" Qty=

  • 下列选项是根据在第一步选择的文件格式而有所不同。 包含列的标题 如果勾选了这个选项,字段名将会包含在导出的文件。 如果零,留空白 如果字段内容是 0,留空白。 追加到输出文件 将记录追加至现有的文件。 遇到错误时继续 在导出进程中忽略遇到的错误。 记录分隔符、字段分隔符、文本标识符号 指定记录的分隔符号、字段的分隔符号和用于括住文本值的字符。 日期排序、日期分隔符 指定日期的格式和日期的分隔符。

  • 下列选项是根据在第一步选择的文件格式而有所不同。 包含列的标题 如果勾选了这个选项,字段名将会包含在导出的文件。 如果零,留空白 如果字段内容是 0,留空白。 追加 将记录追加至现有的文件。 遇到错误时继续 在导出进程中忽略遇到的错误。 在 XML 中使用属性格式 属性格式 <RECORDS> <RECORD OrderNo="1003" ItemNo="1" PartNo="1313" Qty=

  • 问题内容: 我有一堆选择列表,我正在尝试向它们添加“无”和标题选项。代码如下所示: 目前,我无法将它们添加到数据中,因此我试图找到一种方法来使其正常工作。当我第一次加载它们时,“ none”选项不存在。标题在那里并且可以按预期工作,但是似乎我无法在此选择列表中添加两个空白条目。 最简单的方法是将“ none”选项添加到数据中,但这对我来说是不可能的。有没有实现我想要的正确方法? 问题答案: 没错,

  • 但是,如果Terminal中没有提供,我不知道如何(或者是否能够)为其设置默认值。像这样简单的东西不起作用。这里的一个解决方案是根据的内容或大小在函数中设置变量。但我不知道有没有更好的办法做到这一点。 因此,我正在寻找一种方法来使用来自终端的参数调用一个函数,其中需要一个数字(在本例中为2),而其余的是可选的,并设置为默认值。

  • 问题内容: 我正在向数据库中插入大约500 000个对象,其中许多对象是相同的(数据库中具有相同的主键表示),但是其他字段可能不同,因此我使用的方法是“更新-如果没有受影响的行-插入”。问题在于,有时对象的某些字段设置为null(无法从文件读取),并且已经在数据库中设置了某些值,因此我将其更新为null =删除它。)如何实现方案,即只更新字段不为空? 这是我现在如何做的一个简单示例: 问题答案:

  • 下列的选项会根据你在第一步选择的文件格式而有所不同。 字段名行 Navicat 标识哪一行为字段名。 第一个数据行 Navicat 在哪一行开始读取实际数据。 最后一个数据行 Navicat 在哪一行停止读取实际数据。 【注意】如果在文件中没有字段名,请在第一个数据行输入 1 以及在字段名行输入 0。 日期排序、日期分隔符 指定日期的格式和日期的分隔符。 小数点符号 指定小数数值的小数点分隔符。

  • 下列的选项会根据你在第一步选择的文件格式而有所不同。 字段名行 Navicat 标识哪一行为字段名。 第一个数据行 Navicat 在哪一行开始读取实际数据。 最后一个数据行 Navicat 在哪一行停止读取实际数据。 【注意】如果在文件中没有字段名,请在第一个数据行输入 1 以及在字段名行输入 0。 日期排序、日期分隔符 指定日期的格式和日期的分隔符。 小数点符号 指定小数数值的小数点分隔符。