从方法中获取一个字典?

时间:2009-07-05 18:17:23

标签: python

我正在尝试从方法中获取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)

在这里,我尝试使用 inspect 来获取方法:

>>> 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 :(得分:2)

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

答案 1 :(得分: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