You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 16:59:52 +08:00
Merge pull request #273 from rocky/py3-annotation-args
Fix handling py3 annotation args + defparam comma issue
This commit is contained in:
BIN
test/bytecode_3.0_run/04_def_annotate.pyc
Normal file
BIN
test/bytecode_3.0_run/04_def_annotate.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.1_run/04_def_annotate.pyc
Normal file
BIN
test/bytecode_3.1_run/04_def_annotate.pyc
Normal file
Binary file not shown.
BIN
test/bytecode_3.2_run/04_def_annotate.pyc
Normal file
BIN
test/bytecode_3.2_run/04_def_annotate.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -47,6 +47,12 @@ def test14(*args, name: int=1, qname):
|
|||||||
def test15(*args, name='S', fname, qname=4):
|
def test15(*args, name='S', fname, qname=4):
|
||||||
return args, name, fname, qname
|
return args, name, fname, qname
|
||||||
|
|
||||||
|
# From 3.4 /asyncio/streams.py open_connection
|
||||||
|
_DEFAULT_LIMIT = 5
|
||||||
|
def test16(host=None, port=None, *,
|
||||||
|
loop=None, limit=_DEFAULT_LIMIT, **kwds):
|
||||||
|
return host, port, loop, limit, kwds
|
||||||
|
|
||||||
# Python 3.1 _pyio.py uses the -> "IOBase" annotation
|
# Python 3.1 _pyio.py uses the -> "IOBase" annotation
|
||||||
def o(f, mode = "r", buffering = None) -> "IOBase":
|
def o(f, mode = "r", buffering = None) -> "IOBase":
|
||||||
return (f, mode, buffering)
|
return (f, mode, buffering)
|
||||||
@@ -122,6 +128,10 @@ def ann2(args_1, b: int = 5, **kwargs: float) -> float:
|
|||||||
assert ann2.__annotations__['return'] == float
|
assert ann2.__annotations__['return'] == float
|
||||||
assert b == 5
|
assert b == 5
|
||||||
|
|
||||||
|
class TestSignatureObject():
|
||||||
|
def test_signature_on_wkwonly(self):
|
||||||
|
def test(x:int=55, *args: (int, str), c='test', a:float, kwargs:str="S", **b: int) -> int:
|
||||||
|
pass
|
||||||
|
|
||||||
assert test1(1, 5) == (1, 5, 4, {})
|
assert test1(1, 5) == (1, 5, 4, {})
|
||||||
assert test1(1, 5, 6, foo='bar') == (1, 5, 6, {'foo': 'bar'})
|
assert test1(1, 5, 6, foo='bar') == (1, 5, 6, {'foo': 'bar'})
|
||||||
@@ -139,3 +149,4 @@ ann2(1)
|
|||||||
|
|
||||||
assert test12(1, 2, 3, name='hi') == (1, (2, 3)), "a, *args, name"
|
assert test12(1, 2, 3, name='hi') == (1, (2, 3)), "a, *args, name"
|
||||||
assert test13(1, 2, 3, name='hi') == ((1, 2, 3), 'hi'), "*args, name"
|
assert test13(1, 2, 3, name='hi') == ((1, 2, 3), 'hi'), "*args, name"
|
||||||
|
assert test16('localhost', loop=2, limit=3, a='b') == ('localhost', None, 2, 3, {'a': 'b'})
|
||||||
|
@@ -1016,26 +1016,48 @@ class Python3Parser(PythonParser):
|
|||||||
|
|
||||||
# Note order of kwargs and pos args changed between 3.3-3.4
|
# Note order of kwargs and pos args changed between 3.3-3.4
|
||||||
if self.version <= 3.2:
|
if self.version <= 3.2:
|
||||||
rule = "mkfunc ::= %s%s%sload_closure LOAD_CODE %s" % (
|
if annotate_args > 0:
|
||||||
kwargs_str,
|
rule = "mkfunc_annotate ::= %s%s%sannotate_tuple load_closure LOAD_CODE %s" % (
|
||||||
"expr " * args_pos,
|
kwargs_str,
|
||||||
"expr " * annotate_args,
|
"pos_arg " * args_pos,
|
||||||
opname,
|
"annotate_arg " * (annotate_args - 1),
|
||||||
)
|
opname,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
rule = "mkfunc ::= %s%sload_closure LOAD_CODE %s" % (
|
||||||
|
kwargs_str,
|
||||||
|
"pos_arg " * args_pos,
|
||||||
|
opname,
|
||||||
|
)
|
||||||
elif self.version == 3.3:
|
elif self.version == 3.3:
|
||||||
rule = "mkfunc ::= %s%s%sload_closure LOAD_CODE LOAD_STR %s" % (
|
if annotate_args > 0:
|
||||||
kwargs_str,
|
rule = "mkfunc_annotate ::= %s%s%sannotate_tuple load_closure LOAD_CODE LOAD_STR %s" % (
|
||||||
"expr " * args_pos,
|
kwargs_str,
|
||||||
"expr " * annotate_args,
|
"pos_arg " * args_pos,
|
||||||
opname,
|
"annotate_arg " * (annotate_args - 1),
|
||||||
)
|
opname,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
rule = "mkfunc ::= %s%sload_closure LOAD_CODE LOAD_STR %s" % (
|
||||||
|
kwargs_str,
|
||||||
|
"pos_arg " * args_pos,
|
||||||
|
opname,
|
||||||
|
)
|
||||||
|
|
||||||
elif self.version >= 3.4:
|
elif self.version >= 3.4:
|
||||||
rule = "mkfunc ::= %s%s%s load_closure LOAD_CODE LOAD_STR %s" % (
|
if annotate_args > 0:
|
||||||
"expr " * args_pos,
|
rule = "mkfunc_annotate ::= %s%s%sannotate_tuple load_closure LOAD_CODE LOAD_STR %s" % (
|
||||||
kwargs_str,
|
"pos_arg " * args_pos,
|
||||||
"expr " * annotate_args,
|
kwargs_str,
|
||||||
opname,
|
"annotate_arg " * (annotate_args - 1),
|
||||||
)
|
opname,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
rule = "mkfunc ::= %s%s load_closure LOAD_CODE LOAD_STR %s" % (
|
||||||
|
"pos_arg " * args_pos,
|
||||||
|
kwargs_str,
|
||||||
|
opname,
|
||||||
|
)
|
||||||
|
|
||||||
self.add_unique_rule(rule, opname, token.attr, customize)
|
self.add_unique_rule(rule, opname, token.attr, customize)
|
||||||
|
|
||||||
|
@@ -255,12 +255,17 @@ def customize_for_version3(self, version):
|
|||||||
|
|
||||||
def n_mkfunc_annotate(node):
|
def n_mkfunc_annotate(node):
|
||||||
|
|
||||||
if self.version >= 3.3 or node[-2] == 'kwargs':
|
# Handling EXTENDED_ARG before MAKE_FUNCTION ...
|
||||||
|
i = -1 if node[-2] == "EXTENDED_ARG" else 0
|
||||||
|
|
||||||
|
if self.version <= 3.2:
|
||||||
|
code = node[-2+i]
|
||||||
|
elif self.version >= 3.3 or node[-2] == 'kwargs':
|
||||||
# LOAD_CONST code object ..
|
# LOAD_CONST code object ..
|
||||||
# LOAD_CONST 'x0' if >= 3.3
|
# LOAD_CONST 'x0' if >= 3.3
|
||||||
# EXTENDED_ARG
|
# EXTENDED_ARG
|
||||||
# MAKE_FUNCTION ..
|
# MAKE_FUNCTION ..
|
||||||
code = node[-4]
|
code = node[-3+i]
|
||||||
elif node[-3] == 'expr':
|
elif node[-3] == 'expr':
|
||||||
code = node[-3][0]
|
code = node[-3][0]
|
||||||
else:
|
else:
|
||||||
|
@@ -73,7 +73,7 @@ def make_function3_annotate(self, node, is_lambda, nested=1,
|
|||||||
i = -1
|
i = -1
|
||||||
j = annotate_last-1
|
j = annotate_last-1
|
||||||
l = -len(node)
|
l = -len(node)
|
||||||
while j >= l and node[j].kind in ('annotate_arg' 'annotate_tuple'):
|
while j >= l and node[j].kind in ('annotate_arg', 'annotate_tuple'):
|
||||||
annotate_args[annotate_tup[i]] = node[j][0]
|
annotate_args[annotate_tup[i]] = node[j][0]
|
||||||
i -= 1
|
i -= 1
|
||||||
j -= 1
|
j -= 1
|
||||||
@@ -786,6 +786,7 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
|
|||||||
if flag:
|
if flag:
|
||||||
kw_args[i] = "%s" % kwargs[i]
|
kw_args[i] = "%s" % kwargs[i]
|
||||||
self.write(', '.join(kw_args))
|
self.write(', '.join(kw_args))
|
||||||
|
ends_in_comma = False
|
||||||
elif self.version >= 3.6:
|
elif self.version >= 3.6:
|
||||||
# argc = node[-1].attr
|
# argc = node[-1].attr
|
||||||
# co = node[-3].attr
|
# co = node[-3].attr
|
||||||
|
Reference in New Issue
Block a user