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

时间:2015-08-27 20:53:29

标签: 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(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")

5 个答案:

答案 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')

然而,这并不是那么直观,一般来说应该避免使用带有点的属性名称。建议使用destargparse.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']