2009-07-05 8 views
1

Ich versuche, eine dict aus einer Methode zu bekommen, bis jetzt bin ich in der Lage, den Methodennamen und seine Argumente zu bekommen (mit dem Inspect-Modul), das Problem, das ich vor mir habe, ist, dass ich möchte habe auch die Standardargumente (oder den Argumenttyp).Ein Diktat aus einer Methode herausholen?

Dieser im Grunde Test meiner Einheit ist:

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) 

Hier versuche ich die Methode zu bekommen inspizieren zu verwenden:

>>> 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)) 
>>> 

aber mein Problem ist mit dem Standard args, wie Sie hier sehen:

Wie Sie sehen, befindet sich die no_def_args nicht in den Standardeinstellungen. Daher ist es ein Problem, das Argument mit den Standardargumenten abzugleichen.

Antwort

2

Was genau ist das Problem? Alle Argumente sind geordnet, Schlüsselwortargumente sollten die letzte Definition sein. Weißt du, wie man eine Liste schneidet? Hier

+0

ich nicht wusste, dass, wenn Sie dies nicht tun Ordnung deine Argumente ist ein Syntaxfehler, und ja ich weiß, wie man eine Liste schneidet, danke! – igorgue

1

ist, was ich in der Regel tun:

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'} 

Diese nur auf python2.6 arbeiten

+0

Wenn nicht angegeben, ist fillvalue standardmäßig auf Keine eingestellt. ;) – SilentGhost

Verwandte Themen