2009-07-05 34 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

相關問題