我正在尝试找到一种将int或字符串传递给特定命令行参数的方法,但我知道传递给命令行的eveything会以字符串形式返回,有没有办法解决这个问题?
继承我的代码:
parser = ArgumentParser(
description="Generate a simple presentation based on MTD file content"
)
parser.add_argument(
'-m',
dest='mdd',
help="Full path of target mdd",
required=True,
metavar="\"<data>.mdd\"",
)
parser.add_argument(
'-v',
dest='version',
help="The version (latest/active/basic or numerical version)",
required=False,
default='latest'
)
args = parser.parse_args()
MDD_PATH = args.mdd
VERSION = args.version
这是我在命令行中输入的内容@
-m "C:\Users\xxxx\workspace\xxxx\src\Testing\Data\filename.mdd"
-v "22"
我希望-v接受整数和字符串,它有一个默认属性,如果需要可以绕过,但我需要一些帮助,允许它在整数和字符串之间切换。
由于
答案 0 :(得分:0)
在命令行中,一切都是字符串。你的程序无法区分:
program -v "22"
和
program -v 22
shell使用引号来转义参数中的空格。
在你的python代码中,你可以尝试将它转换为int:
VERSION = args.version
try:
VERSION = int(VERSION)
except ValueError:
pass
答案 1 :(得分:0)
您可以使用add_argument method的关键字参数type
。它定义了一种方法,可以使用内置类型或回调将命令行参数转换为您想要的任何内容。
它提供了更好的错误处理,是对命令行进行“类型检查”的首选方法。
答案 2 :(得分:0)
使用type
参数,您还可以过滤掉无效字符串:
def parse_version(v):
if v in ('latest', 'active', 'basic'):
return v
else:
return int(v) # this will error if v is non-numeric, causing the
# parser to reject the argument
parser.add_argument(
'-v',
dest='version',
help="The version (latest/active/basic or numerical version)",
required=False,
default='latest',
type=parse_version
)
答案 3 :(得分:0)
我喜欢使用通常称为tryconvert
的通用辅助函数。给定一个值和一个类型列表(或任何可调用的,真的)它会尝试将值转换为每个类型并返回第一个有效的转换。如果所有这些都失败,则返回原始值。
def tryconvert(value, *types):
for t in types:
try:
return t(value)
except ValueError, TypeError:
pass
return value
这可以与您type
电话上的add_argument
参数一起使用,如下所示:
parser.add_argument(
'-v',
dest='version',
help="The version (latest/active/basic or numerical version)",
required=False,
default='latest',
type=lambda v: tryconvert(v, int)
)
如果对数字的解析失败(例如None
),只需将一个始终返回None
的函数作为最后一个参数传递给tryconvert()
,就可以返回其他值。此“转换”将始终成功,因此如果没有其他转换工作,则会返回该值。如果你经常使用tryconvert
,那么为了便于阅读,编写一个生成这些函数的辅助函数是很方便的:
def default(value):
return lambda *a: value
parser.add_argument(
'-v',
dest='version',
help="The version (latest/active/basic or numerical version)",
required=False,
default='latest',
type=lambda v: tryconvert(v, int, default(None))
)