diff --git a/test/bytecode_3.6/03_fn_defaults.pyc b/test/bytecode_3.6/03_fn_defaults.pyc new file mode 100644 index 00000000..c441b939 Binary files /dev/null and b/test/bytecode_3.6/03_fn_defaults.pyc differ diff --git a/test/simple_source/bug36/03_fn_defaults.py b/test/simple_source/bug36/03_fn_defaults.py new file mode 100644 index 00000000..172d61d1 --- /dev/null +++ b/test/simple_source/bug36/03_fn_defaults.py @@ -0,0 +1,9 @@ +# Python 3.6 changes, yet again, the way deafult pairs are handled +def foo1(bar, baz=1): + return 1 +def foo2(bar, baz, qux=1): + return 2 +def foo3(bar, baz=1, qux=2): + return 3 +def foo4(bar, baz, qux=1, quux=2): + return 4 diff --git a/uncompyle6/semantics/make_function.py b/uncompyle6/semantics/make_function.py index 008b45dc..422b1deb 100644 --- a/uncompyle6/semantics/make_function.py +++ b/uncompyle6/semantics/make_function.py @@ -481,7 +481,10 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None): - handle format tuple parameters """ if default: - value = self.traverse(default, indent='') + if self.version >= 3.6: + value = default + else: + value = self.traverse(default, indent='') maybe_show_ast_param_default(self.showast, name, value) result = '%s=%s' % (name, value) if result[-2:] == '= ': # default was 'LOAD_CONST None' @@ -517,12 +520,17 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None): defparams = node[:args_node.attr] else: default, kw, annotate, closure = args_node.attr - # FIXME: start here for Python 3.6 and above: - defparams = [] - # if default: - # defparams = node[-(2 + kw + annotate + closure)] - # else: - # defparams = [] + if default: + assert node[0] == 'expr', "expecting mkfunc default node to be an expr" + expr_node = node[0] + if (expr_node[0] == 'LOAD_CONST' and + isinstance(expr_node[0].attr, tuple)): + defparams = list(expr_node[0].attr) + elif expr_node[0] == 'list': + defparams = [self.traverse(n, indent='') for n in expr_node[0][:-1]] + else: + defparams = [] + # FIXME: handle kw, annotate and closure kw_args = 0 pass @@ -542,7 +550,7 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None): paramnames = list(code.co_varnames[:argc]) # defaults are for last n parameters, thus reverse - if not 3.0 <= self.version <= 3.1: + if not 3.0 <= self.version <= 3.1 or self.version >= 3.6: paramnames.reverse(); defparams.reverse() try: @@ -562,7 +570,7 @@ def make_function3(self, node, is_lambda, nested=1, codeNode=None): params = [build_param(ast, name, d) for name, d in zip_longest(paramnames, defparams, fillvalue=None)] - if not 3.0 <= self.version <= 3.1: + if not 3.0 <= self.version <= 3.1 or self.version >= 3.6: params.reverse() # back to correct order if code_has_star_arg(code):