Skip to content

Commit 22a2ffe

Browse files
Sup3rGeosseliverstov
authored andcommitted
order param list according to function signature (via #270)
1 parent 2720c13 commit 22a2ffe

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

allure-python-commons/src/utils.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: utf-8 -*-
22

33
import os
4+
import sys
45
import six
56
import time
67
import uuid
@@ -10,6 +11,8 @@
1011
import platform
1112
import threading
1213
import traceback
14+
import collections
15+
1316

1417
if six.PY3:
1518
from traceback import format_exception_only
@@ -122,7 +125,7 @@ def func_parameters(func, *args, **kwargs):
122125
>>> def helper(func):
123126
... def wrapper(*args, **kwargs):
124127
... params = func_parameters(func, *args, **kwargs)
125-
... print(sorted(params.items()))
128+
... print(list(params.items()))
126129
... return func(*args, **kwargs)
127130
... return wrapper
128131
@@ -215,14 +218,12 @@ def func_parameters(func, *args, **kwargs):
215218
... def args_kwargs_varargs_keywords(a, b=2, *c, **d):
216219
... pass
217220
218-
219221
>>> args_kwargs_varargs_keywords(1)
220222
[('a', '1'), ('b', '2')]
221223
222224
>>> args_kwargs_varargs_keywords(1, 2, 4, d=5, e=6)
223225
[('a', '1'), ('b', '2'), ('c', '(4,)'), ('d', '5'), ('e', '6')]
224226
225-
226227
>>> class Class(object):
227228
... @staticmethod
228229
... @helper
@@ -252,24 +253,37 @@ def func_parameters(func, *args, **kwargs):
252253
"""
253254
parameters = {}
254255
arg_spec = inspect.getargspec(func) if six.PY2 else inspect.getfullargspec(func)
256+
arg_order = list(arg_spec.args)
255257
args_dict = dict(zip(arg_spec.args, args))
256258

257259
if arg_spec.defaults:
258260
kwargs_defaults_dict = dict(zip(arg_spec.args[len(args):], arg_spec.defaults))
259261
parameters.update(kwargs_defaults_dict)
260262

261263
if arg_spec.varargs:
264+
arg_order.append(arg_spec.varargs)
262265
varargs = args[len(arg_spec.args):]
263266
parameters.update({arg_spec.varargs: varargs} if varargs else {})
264267

265268
if arg_spec.args and arg_spec.args[0] in ['cls', 'self']:
266269
args_dict.pop(arg_spec.args[0], None)
267270

268-
parameters.update(kwargs)
271+
if kwargs:
272+
if sys.version_info < (3, 6):
273+
# Sort alphabetically as old python versions does
274+
# not preserve call order for kwargs
275+
arg_order.extend(sorted(list(kwargs.keys())))
276+
else:
277+
# Keep py3.6 behaviour to preserve kwargs order
278+
arg_order.extend(list(kwargs.keys()))
279+
parameters.update(kwargs)
280+
269281
parameters.update(args_dict)
270282

271283
items = parameters.iteritems() if six.PY2 else parameters.items()
272-
return dict(map(lambda kv: (kv[0], represent(kv[1])), items))
284+
sorted_items = sorted(map(lambda kv: (kv[0], represent(kv[1])), items), key=lambda x: arg_order.index(x[0]))
285+
286+
return collections.OrderedDict(sorted_items)
273287

274288

275289
def format_traceback(exc_traceback):

0 commit comments

Comments
 (0)