2014-01-21 48 views
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() 
+0

错误意味着'action.dest'是整个元组'''''''',当它只是一个字符串时。 'producer'。打印'options.add_argument(choices [arg])'返回的'Action'对象,以查看发生了什么。 – hpaulj

回答

2

您可能需要采取看看这个:

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][0], **choices[arg][1]) 

add_argument的方法签名看起来像thi S:

add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) 

的名称或标志部分被接收为*args所以一切必须命名。您可以通过扩展**kwargs来从字典中传递已命名的参数。在你的情况下,你传递一个元组,并试图使用它(因为它是一个参数)作为name or flag并在此错误。

相关问题