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

好久不见. 提交于 2020-02-16 05:42:21

问题


Python's argparse lets me define argument names containing a dot in the name. But how can I access these ?

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'

Obviously attribute names can be created with a dot in their name but how can these be accessed ?

Edit: My goal was to let argparse display the inputfile.txt name (e.g. with --help) but call the attribute "inputfile".

After trying some of the suggestions the easiest way to accomplish this is using the metavar option:

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

回答1:


Internally, argparse will add all attributes to the Namespace() instance with setattr. Accordingly, you can access the values with getattr:

getattr(args, 'inputfile.txt')

However, this is not as intuitive and in general attribute names with dots in them should be avoided. It is recommended to use the dest option of argparse.add_argument to define your own variable in which to store the value for that argument, as hd1 suggests in their answer.




回答2:


Using the dest option, you can assign it to anything:

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

Hope that helps.




回答3:


Why not use FileType objects instead?

>>> 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>)



回答4:


Rename the argument to inputfile and use metavar to set the display value for the user.

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)



回答5:


I strongly recommend you to refactor your code to change the argument name.
But, if you won't or can't, this will do the job:

args.__dict__['inputfile.txt']


来源:https://stackoverflow.com/questions/32259248/how-to-access-a-python-argparse-argument-with-a-dot-in-the-name

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!