如何访问名称中带点的 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)
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)