1
在Python 2.7中使用argparse我试图通过不重复代码并使用代码进行重用来减少我的代码。在这种情况下,我试图重用给不同子分析器的参数。但是,我得到我的东西可能是从我试图打电话的方式错误/分配的属性:Python Argparse重用属性TypeError:hasattr():属性名称必须是字符串
import argparse
def create_args():
parser = argparse.ArgumentParser(description='Transfer file between accounts.'
'Add/remove tabs and Schemas')
subparser = parser.add_subparsers(help='Transfer file between acconts')
transfer = subparser.add_parser('transfer',
help="Transfer file from 2 accounts")
add_arguments(transfer, "producer", "consumer", "uuid")
return parser
def add_arguments(group, *args):
options = group.add_argument_group("Switches")
choices = {
"producer" : ('-p',
'--producer',
'required=True',
'help="Producer\'s(source account)"'),
"consumer" : ('-c',
'--consumer',
'required=True',
'help="Consumer\'s(destination account)"'),
"uuid" : ('-u',
'--uuid',
'required=True',
'help="file ID number"')}
for arg in args:
options.add_argument(choices[arg])
[email protected] ~/image_transfer $ python transfer.py transfer
Traceback (most recent call last):
File "transfer.py", line 19, in <module>
start()
File "transfer.py", line 12, in start
args = vars(parser.parse_args())
File "/usr/lib/python2.7/argparse.py", line 1688, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "/usr/lib/python2.7/argparse.py", line 1720, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
File "/usr/lib/python2.7/argparse.py", line 1929, in _parse_known_args
stop_index = consume_positionals(start_index)
File "/usr/lib/python2.7/argparse.py", line 1885, in consume_positionals
take_action(action, args)
File "/usr/lib/python2.7/argparse.py", line 1794, in take_action
action(self, namespace, argument_values, option_string)
File "/usr/lib/python2.7/argparse.py", line 1090, in __call__
namespace, arg_strings = parser.parse_known_args(arg_strings, namespace)
File "/usr/lib/python2.7/argparse.py", line 1706, in parse_known_args
if not hasattr(namespace, action.dest):
TypeError: hasattr(): attribute name must be string
def start():
parser = create_args()
args = vars(parser.parse_args())
if __name__ == "__main__":
start()
错误意味着'action.dest'是整个元组'''''''',当它只是一个字符串时。 'producer'。打印'options.add_argument(choices [arg])'返回的'Action'对象,以查看发生了什么。 – hpaulj