如何访问名称中带有点的python argparse参数

如何访问名称中带有点的python argparse参数,python,argparse,Python,Argparse,Python的argparse允许我定义名称中包含点的参数名称。但我如何才能访问这些 import argparse parser = argparse.ArgumentParser() parser.add_argument("inputfile.txt") parser.add_argument("outputfile.txt") args = parser.parse_args(['hello', 'world']) # now args is: # Namespace(input

Python的argparse允许我定义名称中包含点的参数名称。但我如何才能访问这些

import argparse


parser = argparse.ArgumentParser()
parser.add_argument("inputfile.txt")
parser.add_argument("outputfile.txt")

args = parser.parse_args(['hello', 'world'])

# now args is:
# Namespace(inputfile.txt='hello', outputfile.txt='world')


# and this does not work
print(args.inputfile.txt)
>>> AttributeError: 'Namespace' object has no attribute 'inputfile'
显然,属性名可以在其名称中使用点来创建,但如何访问它们呢

编辑: 我的目标是让argparse显示inputfile.txt名称(例如使用--help),但调用属性“inputfile”

在尝试了一些建议之后,实现这一点的最简单方法是使用metavar选项:

parser.add_argument("inputfile", metavar="inputfile.txt")

使用dest选项,可以将其分配给任何对象:

parser = argparse.ArgumentParser()
parser.add_argument("inputfile.txt", dest='infile')
parser.add_argument("outputfile.txt", dest='out')

args = parser.parse_args(['hello', 'world'])
# now args is:
# Namespace(infile='hello', out='world')

希望能有所帮助。

我强烈建议您重构代码以更改参数名称。
但是,如果您不愿意或不能,这将完成工作:

args.__dict__['inputfile.txt']

在内部,
argparse
将使用将所有属性添加到
Namespace()
实例。因此,您可以通过以下方式访问这些值:

但是,这并不是那么直观,一般来说,应该避免使用带有点的属性名称。建议使用选项定义您自己的变量,在其中存储该参数的值,正如hd1在其回答中所建议的那样。

为什么不使用对象

>>> import argparse
>>>
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--infile', type=argparse.FileType('r'))
_StoreAction(option_strings=['--infile'], dest='infile', nargs=None, const=None, default=None, type=FileType('r'), choices=None, help=None, metavar=None)
>>> parser.add_argument('--outfile', type=argparse.FileType('w'))
_StoreAction(option_strings=['--outfile'], dest='outfile', nargs=None, const=None, default=None, type=FileType('w'), choices=None, help=None, metavar=None)
>>> parser.parse_args(['--infile', 'input.txt', '--outfile', 'output.txt'])
Namespace(infile=<open file 'input.txt', mode 'r' at 0x100f99e40>, outfile=<open file 'output.txt', mode 'w' at 0x100f99ed0>)
导入argparse >>> >>>parser=argparse.ArgumentParser() >>>parser.add_参数('--infle',type=argparse.FileType('r')) _StoreAction(选项_strings=['--infle'],dest='infle',nargs=None,const=None,default=None,type=FileType('r'),choices=None,help=None,metavar=None) >>>parser.add_参数('--outfile',type=argparse.FileType('w')) _StoreAction(选项_strings=['--outfile'],dest='outfile',nargs=None,const=None,default=None,type=FileType('w'),choices=None,help=None,metavar=None) >>>parser.parse_参数(['--infle',input.txt','--outfile',output.txt'])) 命名空间(infile=,outfile=)
将参数重命名为
inputfile
,并使用
metavar
为用户设置显示值

import argparse


parser = argparse.ArgumentParser()
parser.add_argument("inputfile", metavar = "inputfile.txt")
parser.add_argument("outputfile", metavar = "outputfile.txt")

args = parser.parse_args(['hello', 'world'])

# now args is:
# Namespace(inputfile='hello', outputfile='world')

print(args.inputfile)

我想你指的是选择。还有,第一个
metavar
nice catch,@lemonhead!这将导致ValueError:dest为位置参数提供了两次。getattr工作。但是,按照建议使用dest选项会导致ValueError:dest为位置参数doh提供了两次,是的,请查阅位置参数的
argparse
源代码(例如,参数不是以“-”开头)
dest
。因此,我要么将arg设置为可选的,将其重命名,要么您就可以在
getattr
谢谢。我已经添加了我的原始目标(使用--help查看“inputfile.txt”,但将属性命名为inputfile),这可以通过使用metavarYes、一个干净的
dest
和一个
metavar
来实现,因为帮助是最好的方法。
import argparse


parser = argparse.ArgumentParser()
parser.add_argument("inputfile", metavar = "inputfile.txt")
parser.add_argument("outputfile", metavar = "outputfile.txt")

args = parser.parse_args(['hello', 'world'])

# now args is:
# Namespace(inputfile='hello', outputfile='world')

print(args.inputfile)