@@ -106,21 +106,159 @@ def represent(item):
106106 return repr (item )
107107
108108
109- def func_parameters (func , * a , ** kw ):
110- bowels = inspect .getargspec (func ) if sys .version_info .major < 3 else inspect .getfullargspec (func )
111- args_dict = dict (zip (bowels .args , map (represent , a )))
112- try :
113- del args_dict ["self" ]
114- except KeyError :
115- pass
116- kwargs_dict = dict (zip (kw , list (map (lambda i : represent (kw [i ]), kw ))))
117- try :
118- del kwargs_dict ["self" ]
119- except KeyError :
120- pass
121- kwarg_defaults = dict (zip (reversed (bowels .args ), reversed (list (map (represent , bowels .defaults or ())))))
122- kwarg_defaults .update (kwargs_dict )
123- return args_dict , kwarg_defaults
109+ def func_parameters (func , * args , ** kwargs ):
110+ """
111+ >>> def helper(func):
112+ ... def wrapper(*args, **kwargs):
113+ ... params = func_parameters(func, *args, **kwargs)
114+ ... print(sorted(params.items()))
115+ ... return func(*args, **kwargs)
116+ ... return wrapper
117+
118+ >>> @helper
119+ ... def args(a, b):
120+ ... pass
121+
122+ >>> args(1, 2)
123+ [('a', '1'), ('b', '2')]
124+
125+ >>> args(*(1,2))
126+ [('a', '1'), ('b', '2')]
127+
128+ >>> args(1, b=2)
129+ [('a', '1'), ('b', '2')]
130+
131+ >>> @helper
132+ ... def kwargs(a=1, b=2):
133+ ... pass
134+
135+ >>> kwargs()
136+ [('a', '1'), ('b', '2')]
137+
138+ >>> kwargs(a=3, b=4)
139+ [('a', '3'), ('b', '4')]
140+
141+ >>> kwargs(b=4, a=3)
142+ [('a', '3'), ('b', '4')]
143+
144+ >>> kwargs(a=3)
145+ [('a', '3'), ('b', '2')]
146+
147+ >>> kwargs(b=4)
148+ [('a', '1'), ('b', '4')]
149+
150+ >>> @helper
151+ ... def args_kwargs(a, b, c=3, d=4):
152+ ... pass
153+
154+ >>> args_kwargs(1, 2)
155+ [('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')]
156+
157+ >>> args_kwargs(1, 2, d=5)
158+ [('a', '1'), ('b', '2'), ('c', '3'), ('d', '5')]
159+
160+ >>> args_kwargs(1, 2, 5, 6)
161+ [('a', '1'), ('b', '2'), ('c', '5'), ('d', '6')]
162+
163+ >>> @helper
164+ ... def varargs(*a):
165+ ... pass
166+
167+ >>> varargs()
168+ []
169+
170+ >>> varargs(1, 2)
171+ [('a', '(1, 2)')]
172+
173+ >>> @helper
174+ ... def keywords(**a):
175+ ... pass
176+
177+ >>> keywords()
178+ []
179+
180+ >>> keywords(a=1, b=2)
181+ [('a', '1'), ('b', '2')]
182+
183+ >>> @helper
184+ ... def args_varargs(a, b, *c):
185+ ... pass
186+
187+ >>> args_varargs(1, 2)
188+ [('a', '1'), ('b', '2')]
189+
190+ >>> args_varargs(1, 2, 2)
191+ [('a', '1'), ('b', '2'), ('c', '(2,)')]
192+
193+ >>> @helper
194+ ... def args_kwargs_varargs(a, b, c=3, **d):
195+ ... pass
196+
197+ >>> args_kwargs_varargs(1, 2)
198+ [('a', '1'), ('b', '2'), ('c', '3')]
199+
200+ >>> args_kwargs_varargs(1, 2, 4, d=5, e=6)
201+ [('a', '1'), ('b', '2'), ('c', '4'), ('d', '5'), ('e', '6')]
202+
203+ >>> @helper
204+ ... def args_kwargs_varargs_keywords(a, b=2, *c, **d):
205+ ... pass
206+
207+
208+ >>> args_kwargs_varargs_keywords(1)
209+ [('a', '1'), ('b', '2')]
210+
211+ >>> args_kwargs_varargs_keywords(1, 2, 4, d=5, e=6)
212+ [('a', '1'), ('b', '2'), ('c', '(4,)'), ('d', '5'), ('e', '6')]
213+
214+
215+ >>> class Class(object):
216+ ... @staticmethod
217+ ... @helper
218+ ... def static_args(a, b):
219+ ... pass
220+ ...
221+ ... @classmethod
222+ ... @helper
223+ ... def method_args(cls, a, b):
224+ ... pass
225+ ...
226+ ... @helper
227+ ... def args(self, a, b):
228+ ... pass
229+
230+ >>> cls = Class()
231+
232+ >>> cls.args(1, 2)
233+ [('a', '1'), ('b', '2')]
234+
235+ >>> cls.method_args(1, 2)
236+ [('a', '1'), ('b', '2')]
237+
238+ >>> cls.static_args(1, 2)
239+ [('a', '1'), ('b', '2')]
240+
241+ """
242+ parameters = {}
243+ arg_spec = inspect .getargspec (func ) if sys .version_info .major < 3 else inspect .getfullargspec (func )
244+ args_dict = dict (zip (arg_spec .args , args ))
245+
246+ if arg_spec .defaults :
247+ kwargs_defaults_dict = dict (zip (arg_spec .args [len (args ):], arg_spec .defaults ))
248+ parameters .update (kwargs_defaults_dict )
249+
250+ if arg_spec .varargs :
251+ varargs = args [len (arg_spec .args ):]
252+ parameters .update ({arg_spec .varargs : varargs } if varargs else {})
253+
254+ if arg_spec .args and arg_spec .args [0 ] in ['cls' , 'self' ]:
255+ args_dict .pop (arg_spec .args [0 ], None )
256+
257+ parameters .update (kwargs )
258+ parameters .update (args_dict )
259+
260+ items = parameters .iteritems () if sys .version_info .major < 3 else parameters .items ()
261+ return dict (map (lambda kv : (kv [0 ], represent (kv [1 ])), items ))
124262
125263
126264def format_traceback (exc_traceback ):
0 commit comments