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_argument
的 type
参数接受检查和转换的可调用对象。
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)
我不太清楚标题的措辞,但我正在尝试使用 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_argument
的 type
参数接受检查和转换的可调用对象。
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)