Python argparse:如何引用带有破折号的参数
我正在使用,我想指定带有破折号的位置参数。argparse似乎让我这么做。事实上,它出现在parse_args()的名称空间中,但我不知道如何引用相应的值。下面是一个简单的示例(请注意“a-string”中的破折号):Python argparse:如何引用带有破折号的参数,python,argparse,Python,Argparse,我正在使用,我想指定带有破折号的位置参数。argparse似乎让我这么做。事实上,它出现在parse_args()的名称空间中,但我不知道如何引用相应的值。下面是一个简单的示例(请注意“a-string”中的破折号): 我最初想用参数to来解决这个问题,但如果我将dest添加到位置参数中,就会得到“ValueError:dest为位置参数提供了两次”。如何引用此位置参数的值?这些参数作为parse_args()返回的命名空间对象的属性提供。但是标识符(包括属性)中不能有连字符(至少如果您想直接访
我最初想用参数to来解决这个问题,但如果我将dest添加到位置参数中,就会得到“ValueError:dest为位置参数提供了两次”。如何引用此位置参数的值?这些参数作为
parse_args()
返回的命名空间对象的属性提供。但是标识符(包括属性)中不能有连字符(至少如果您想直接访问它们的话不能),因为它是一个减号,这意味着其他东西
如果希望用户将参数命名为“a-string”,但在代码中可作为a_string
(这是您尝试的方法之一)访问,则可以使用metavar
参数指定如何向用户描述它
parser.add_argument('a_string', help='A string', metavar='a-string')
args = parser.parse_args()
print(args.a_string)
参数将在使用信息中显示为:
位置参数:
a字串a字串
参数作为
parse_args()
返回的命名空间对象的属性提供。但是标识符(包括属性)中不能有连字符(至少如果您想直接访问它们的话不能),因为它是一个减号,这意味着其他东西
如果希望用户将参数命名为“a-string”,但在代码中可作为a_string
(这是您尝试的方法之一)访问,则可以使用metavar
参数指定如何向用户描述它
parser.add_argument('a_string', help='A string', metavar='a-string')
args = parser.parse_args()
print(args.a_string)
参数将在使用信息中显示为:
位置参数:
a字串a字串
dest
带“-”的选项和位置选项的处理方式不同
In [298]: import argparse
In [299]: parser = argparse.ArgumentParser()
In [300]: a1 = parser.add_argument('--a-string');
In [301]: a2 = parser.add_argument('foo-string');
In [302]: parser.print_help()
usage: ipython3 [-h] [--a-string A_STRING] foo-string
positional arguments:
foo-string
optional arguments:
-h, --help show this help message and exit
--a-string A_STRING
optional
的dest
源自第一个“long”标志,将任何内部“-”替换为“\u”。位置的dest
是第一个参数,没有任何替换。您可以完全控制位置dest
In [304]: args = parser.parse_args(['xxx'])
In [305]: args
Out[305]: Namespace(a_string=None, **{'foo-string': 'xxx'})
In [306]: args.a_string
仍可访问dash dest:
In [307]: vars(args)['foo-string']
Out[307]: 'xxx'
In [308]: getattr(args, 'foo-string')
Out[308]: 'xxx'
“-/-”替换完成后,您可以在标志中使用“-”,但仍然可以使用点语法访问属性
内部argparse
使用getattr
和setattr
,因此它不限制dest
。它不必是有效的python名称。这适用于选项和位置
如果我给可选的adest
值(与标志不同)
这将“A_字符串”更改为“A字符串”,但也更改了属性名称:
In [313]: args = parser.parse_args(['xxx'])
In [314]: args
Out[314]: Namespace(**{'a-string': None, 'foo-string': 'xxx'})
metavar
允许我们控制值在帮助中的显示方式。然后,我们可以选择dest
作为任何实用的选项(如果愿意,也可以选择不实用的选项)
丑陋的dest,独立于标志和元变量:
In [320]: a1.dest='a-#$'; a2.dest='-xxx$3'
In [321]: args = parser.parse_args(['xxx'])
In [322]: args
Out[322]: Namespace(**{'-xxx$3': 'xxx', 'a-#$': None})
In [323]: getattr(args, '-xxx$3')
Out[323]: 'xxx'
In [324]: parser.print_usage()
usage: ipython3 [-h] [--a-string MY-STRING] YOUR-STRING
一些人认为位置应该执行'-/"替换。但是由于metavar
可以完全控制帮助显示,因此没有必要这样做。充其量,if只会使positionals
的行为更像'optionals'
使用
metavar
的选项更加有限。特殊字符可能会弄乱用法
格式,特别是当用法较长(多行)或使用互斥组时。这种格式相当脆弱。dest
带“-”的格式与可选格式和位置格式处理方式不同
In [298]: import argparse
In [299]: parser = argparse.ArgumentParser()
In [300]: a1 = parser.add_argument('--a-string');
In [301]: a2 = parser.add_argument('foo-string');
In [302]: parser.print_help()
usage: ipython3 [-h] [--a-string A_STRING] foo-string
positional arguments:
foo-string
optional arguments:
-h, --help show this help message and exit
--a-string A_STRING
optional
的dest
源自第一个“long”标志,将任何内部“-”替换为“\u”。位置的dest
是第一个参数,没有任何替换。您可以完全控制位置dest
In [304]: args = parser.parse_args(['xxx'])
In [305]: args
Out[305]: Namespace(a_string=None, **{'foo-string': 'xxx'})
In [306]: args.a_string
仍可访问dash dest:
In [307]: vars(args)['foo-string']
Out[307]: 'xxx'
In [308]: getattr(args, 'foo-string')
Out[308]: 'xxx'
“-/-”替换完成后,您可以在标志中使用“-”,但仍然可以使用点语法访问属性
内部argparse
使用getattr
和setattr
,因此它不限制dest
。它不必是有效的python名称。这适用于选项和位置
如果我给可选的adest
值(与标志不同)
这将“A_字符串”更改为“A字符串”,但也更改了属性名称:
In [313]: args = parser.parse_args(['xxx'])
In [314]: args
Out[314]: Namespace(**{'a-string': None, 'foo-string': 'xxx'})
metavar
允许我们控制值在帮助中的显示方式。然后,我们可以选择dest
作为任何实用的选项(如果愿意,也可以选择不实用的选项)
丑陋的dest,独立于标志和元变量:
In [320]: a1.dest='a-#$'; a2.dest='-xxx$3'
In [321]: args = parser.parse_args(['xxx'])
In [322]: args
Out[322]: Namespace(**{'-xxx$3': 'xxx', 'a-#$': None})
In [323]: getattr(args, '-xxx$3')
Out[323]: 'xxx'
In [324]: parser.print_usage()
usage: ipython3 [-h] [--a-string MY-STRING] YOUR-STRING
一些人认为位置应该执行'-/"替换。但是由于metavar
可以完全控制帮助显示,因此没有必要这样做。充其量,if只会使positionals
的行为更像'optionals'
使用
metavar
的选项更加有限。特殊字符可能会弄乱用法
格式,特别是当用法较长(多行)或使用互斥组时。这种格式相当脆弱。“dest”不适用于位置参数。注意我的最后一段,你也注意到了。然后换一种方式:让a_string
作为它的实际名称,并使用metavar
改变它向用户显示的方式。啊,很有创意。我没有想过要改变我的想法,使用metavar。老实说,我希望argparse将“dest”作为位置参数的选项。那将很自然地解决我的问题。但是你的metavar想法行得通,所以我会用它。谢谢。是的,我很惊讶dest
不起作用。但是对于关键字参数来说,它更有意义,因为变量