Fix bugs in 3.6 default parameter handling

Mentioned in Issue #139
This commit is contained in:
rocky
2017-12-01 20:12:06 -05:00
parent edfedec65c
commit dad1b4780c
3 changed files with 26 additions and 9 deletions

Binary file not shown.

View File

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

View File

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