【问题标题】:Argparse optionnal arguments with default values具有默认值的 argparse 可选参数
【发布时间】:2017-11-28 22:58:43
【问题描述】:

python 和法语新手,对于任何英语错误,我们深表歉意 :)。 我正在做一些我需要使用 argparse 的事情。 这是我遇到问题的代码:

mission.py

parser = argparse.ArgumentParser()
parser.add_argument('--create n file', dest='create', nargs=2,
default=(1,'world1.json'), help='Create a party of n player with mission parameters in file')

我正在尝试找到一种方法将 n 和 file 都设置为其他值,或者只设置其中一个。 n 是 int,file 是 str。

这是我想使用以下命令获得的:

pythonmission.py --create 2 ##expected result > create = [2,'world1.json']

pythonmission.py --create world2.json #expected result > create = [1,'world2.json']

pythonmission.py --create 3 world2.json #预期结果 > create = [3,'world2.json']

当使用 --create 时(有或没有指定 n/file),我需要使用列表作为参数来启动一个函数。

我尝试了多种方法并多次阅读 argparse 文档,但找不到方法。

感谢您的帮助。

【问题讨论】:

  • 更改为add_argument('--create', nargs='+')。解析后自行决定如何处理 args.create 列表中的 1 个或多个字符串。 argparse 未设置解码 int 和 str 类型的混合。
  • 节省大量工作,使用开始库。 pypi.python.org/pypi/begins/0.9
  • @stevej,begins 对这个规范有何帮助?你如何将这个要求表达为函数的参数?
  • 进一步考虑,我想我可以想出一个自定义的 type 函数和 Action 类来满足你的需求,甚至可以零碎地替换默认值。但是在解析后进行转换同样容易。你为什么不这样做,然后我可以建议如何使它成为解析器的一部分?
  • 编辑了我的问题以添加我的目标是使用--create。 @hpaulj 使用 nargs='+' 不能满足我的需要。由于用户可以单独使用--create 来使用默认列表 [1, 'world1.json] 进行聚会。之后你建议我做的就是在之后解码列表?

标签: python argparse


【解决方案1】:

下面的代码返回列出的用例的预期结果。我决定使用一个额外的函数来处理参数,因为程序必须接受 int 或 string 作为传递的第一个参数。

在继续之前,我使用“try”块来查看单个参数是否可以解析为 int。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--create n file', dest='create', nargs='+', default=(1,'world1.json'),
                    help='Create a party of n player with mission parameters in file')
args = parser.parse_args()

def get_n_file(arg):
    if len(arg)==1:
        try:
            i = int(arg[0])
            result = int(arg[0]), 'world'+str(arg[0])+'.json'
        except:
            s = arg[0]
            result = 1, s
        return result
    elif len(arg)==2:
        return int(arg[0]), arg[1]

print(args.create)

n, f = get_n_file(args.create)

print(n, f)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2013-04-25
    • 2021-09-24
    • 2017-10-13
    • 2023-01-11
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多