我正在尝试从方法中获取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
不在默认值中,因此尝试将参数与其默认参数匹配是个问题。
答案 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