argparse 参数可以是 str 或 int 以及处理它的最简单方法

argparse argument may be str or int and the simplest way to handle it

我不太清楚标题的措辞,但我正在尝试使用 argparse 输入两个变量。第一个参数可以是字符串或整数,第二个参数始终是整数。

第一个例子是 python calnum.py -x 2 -y 4。在我下面的示例代码中,它将第一个参数视为字符串而不是 int。由于下面的第二个有效示例,我没有指定 type=int

另一个例子是 python calnum.py -x curve -y 0

如果第一个参数是曲线,那么第二个参数应该是 0。下面我将它设置为零,这是可行的,或者更好的做法是显示错误并让用户实际为第二个参数输入 0,如果他们没有'输入零或使用帮助命令?

实际上,如果它设置为曲线,则根本不需要输入 y,只需设置 y = 0,但如果用户输入某些内容,我应该对其进行处理还是忽略它并将其设置为 0,就像在下面的代码或完全以另一种方式进行。

还有什么是处理关于作为 int 的第一个参数的最佳方法。先验证是不是int再转成int做运算?我在下面有一些代码,但不太清楚如何处理它。当我刚开始阅读有关 argparse 的内容时,我可能会完全出错。

是否有任何简单(简短)的方法可以从命令行处理这两个示例?由于我的经验有限,我更喜欢易于阅读的代码而不是简短复杂的代码。希望我解释得足够好,我们将不胜感激任何帮助,或者只是问问我是否遗漏了什么,谢谢。

import argparse

my_parser = argparse.ArgumentParser()

my_parser.add_argument('-x', action='store')
my_parser.add_argument('-y', action='store', type=int)

args = my_parser.parse_args()

if args.x == "curve":
    args.y = 0
elif str.isdigit(args.x):
    args.x = int(args.x)

处理它的最佳方法是将其作为字符串读取,然后使用函数 str.isdecimal 检查它是否为数字。如果是,您可以安全地使用 int(val) 转换为 int,否则,将其视为字符串。

可能是这样的:

import argparse

my_parser = argparse.ArgumentParser()

my_parser.add_argument('-x', action='store')
my_parser.add_argument('-y', action='store', type=int)

args = my_parser.parse_args()

if args.x.isdecimal():
    as_int = int(args.x)
else:
    args.y = 0

add_argumenttype 参数接受检查和转换的可调用对象。

import argparse


def maybe_str_or_int(arg):
    try:
        return int(arg)  # try convert to int
    except ValueError:
        pass
    if arg == "curve":
        return arg
    raise argparse.ArgumentTypeError("x must be an int or 'curve'")


my_parser = argparse.ArgumentParser()

my_parser.add_argument('-x', action='store', type=maybe_str_or_int)
my_parser.add_argument('-y', action='store', type=int)

args = my_parser.parse_args(['-x', 'na'])  # cause error message
# args = my_parser.parse_args(['-x', 'curve'])  # no error
# args = my_parser.parse_args(['-x', '123'])  # no error

if args.x == "curve":
    args.y = 0
elif not isinstance(args.x, int):
    print(args.x)