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

How to access a python argparse argument with a dot in the name

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 将使用 setattr. Accordingly, you can access the values with getattr:

添加所有属性到 Namespace() 实例
getattr(args, 'inputfile.txt')

但是,这并不直观,通常应避免使用带点的属性名称。建议使用 dest option of argparse.add_argument 定义您自己的变量来存储该参数的值,正如 hd1 在他们的回答中所建议的那样。

为什么不使用 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>)

将参数重命名为 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)