Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python argparse:如何引用带有破折号的参数_Python_Argparse - Fatal编程技术网

Python argparse:如何引用带有破折号的参数

Python argparse:如何引用带有破折号的参数,python,argparse,Python,Argparse,我正在使用,我想指定带有破折号的位置参数。argparse似乎让我这么做。事实上,它出现在parse_args()的名称空间中,但我不知道如何引用相应的值。下面是一个简单的示例(请注意“a-string”中的破折号): 我最初想用参数to来解决这个问题,但如果我将dest添加到位置参数中,就会得到“ValueError:dest为位置参数提供了两次”。如何引用此位置参数的值?这些参数作为parse_args()返回的命名空间对象的属性提供。但是标识符(包括属性)中不能有连字符(至少如果您想直接访

我正在使用,我想指定带有破折号的位置参数。argparse似乎让我这么做。事实上,它出现在parse_args()的名称空间中,但我不知道如何引用相应的值。下面是一个简单的示例(请注意“a-string”中的破折号):


我最初想用参数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名称。这适用于选项和位置

如果我给可选的a
dest
值(与标志不同)

这将“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名称。这适用于选项和位置

如果我给可选的a
dest
值(与标志不同)

这将“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
不起作用。但是对于关键字参数来说,它更有意义,因为变量