2009-07-05 39 views
1

我试图从方法中获得dict,到目前为止我能够获得方法名称及其参数(使用inspect模块),但我面临的问题是我想要也有默认参数(或参数类型)。从方法中得到一个字典?

这基本上是我的单元测试:

class Test: 
    def method1(anon_type, array=[], string="string", integer=12, obj=None): 
     pass 

target = {"method1": [ 
      {"anon": "None"}, 
      {"array": "[]"}, 
      {"string": "str"}, 
      {"integer": "int"}, 
      {"obj": "None"}] 
     } 
method1_dict = get_method_dict(Test().method1) 

self.assertEqual(target, method1_dict) 

在这里,我尝试使用检查获得方法:

>>> import inspect 
>>> class Class: 
...  def method(self, string='str', integer=12): 
...    pass 
... 
>>> m_desc = inspect.getargspec(Class().method) 
>>> m_desc 
ArgSpec(args=['self', 'string', 'integer'], varargs=None, keywords=None, defaults=('str', 12)) 
>>> 

,但我的问题是与默认ARGS,如你所见:

>>> class Class: 
...  def method(self, no_def_args, string='str', integer=12): 
...    pass 
... 
>>> m_desc = inspect.getargspec(Class().method) 
>>> m_desc 
ArgSpec(args=['self', 'no_def_args', 'string', 'integer'], varargs=None, keywords=None, defaults=('str', 12)) 

如您所见,no_def_args不在默认值中,因此尝试将参数与其默认参数进行匹配是个问题。

回答

2

究竟是什么问题?所有参数都是有序的,关键字参数应该是最后一个定义。你知道如何切片清单吗?

+0

工作,我不知道,如果你不命令你的论点是一个语法错误,是的,我知道如何切片清单,谢谢! – igorgue 2009-07-05 18:44:49

1

这是我平时做:

import inspect, itertools 
args, varargs, keywords, defaults = inspect.getargspec(method1) 
print dict(itertools.izip_longest(args[::-1], defaults[::-1], fillvalue=None)) 

- >

{'integer': 12, 'array': [], 'anon_type': None, 'obj': None, 'string': 'string'} 

这只会在python2.6的

+0

如果未指定,fillvalue默认为None。 ;) – SilentGhost 2009-07-05 18:51:48

相关问题