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")
答案 0 :(得分:2)
使用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')
希望有所帮助。
答案 1 :(得分:2)
在内部,argparse
会将Namespace()
个实例的所有属性添加到setattr
。因此,您可以使用getattr
:
getattr(args, 'inputfile.txt')
然而,这并不是那么直观,一般来说应该避免使用带有点的属性名称。建议使用dest
的argparse.add_argument
选项来定义您自己的变量,用于存储该参数的值,正如hd1在答案中建议的那样。
答案 2 :(得分:1)
为什么不使用FileType个对象?
>>> 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>)
答案 3 :(得分:1)
将参数重命名为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)
答案 4 :(得分:0)
我强烈建议您重构代码以更改参数名称 但是,如果你不能或不能,这将完成这项工作:
args.__dict__['inputfile.txt']