Closed williamjamir closed 6 years ago
Hmm, actually it seems this is an issue in 2.7.6 as well. Thanks for reporting!
Aye, this is a difficult case because these two parse to the same ast:
try:
try:
a
except:
b
finally:
c
and
try:
a
except:
b
finally:
c
Both result in:
"Module(body=[TryFinally(body=[TryExcept(body=[Expr(value=Name(id='a', ctx=Load()))], handlers=[ExceptHandler(type=None, name=None, body=[Expr(value=Name(id='b', ctx=Load()))])], orelse=[])], finalbody=[Expr(value=Name(id='c', ctx=Load()))])])"
The extra desugaring throws off the annotator.
Hmm should we commit to supporting cases like this?
It is a bit weird to respect it since the ast doesn't really respect this pattern (which I assume is because these two forms are semantically equivalent anyway).
Hi @soupytwist
I tested here your last commit with the following file and everything was ok:
try:
print('1')
try:
error = 1/0
except:
print('2')
finally:
print('3')
But, when I commented the print('1')
the parser could not recognize the nested try
file: test.py
try:
# print('1')
try:
error = 1/0
except:
print('2')
finally:
print('3')
Running the file to show that it's a valid syntax =)
(pasta_py27) william@laptop:/opt/test_pasta$ python --version
Python 2.7.14
(pasta_py27) william@laptop:/opt/test_pasta$ python test.py
2
3
Running the parse on this test.py file:
(pasta_py27) william@laptop:/opt/test_pasta$ python script.py
Traceback (most recent call last):
File "script.py", line 8, in <module>
tree = pasta.parse(file.read())
File "/opt/pasta/pasta/__init__.py", line 25, in parse
annotator.visit(t)
File "/opt/pasta/pasta/base/annotate.py", line 1055, in visit
super(AstAnnotator, self).visit(node)
File "/opt/pasta/pasta/base/annotate.py", line 115, in visit
super(BaseVisitor, self).visit(node)
File "/home/william/miniconda3/envs/google_pasta_py27/lib/python2.7/ast.py", line 241, in visit
return visitor(node)
File "/opt/pasta/pasta/base/annotate.py", line 79, in wrapped
f(self, node, *args, **kwargs)
File "/opt/pasta/pasta/base/annotate.py", line 168, in visit_Module
self.generic_visit(node)
File "/home/william/miniconda3/envs/google_pasta_py27/lib/python2.7/ast.py", line 249, in generic_visit
self.visit(item)
File "/opt/pasta/pasta/base/annotate.py", line 1055, in visit
super(AstAnnotator, self).visit(node)
File "/opt/pasta/pasta/base/annotate.py", line 115, in visit
super(BaseVisitor, self).visit(node)
File "/home/william/miniconda3/envs/google_pasta_py27/lib/python2.7/ast.py", line 241, in visit
return visitor(node)
File "/opt/pasta/pasta/base/annotate.py", line 79, in wrapped
f(self, node, *args, **kwargs)
File "/opt/pasta/pasta/base/annotate.py", line 373, in visit_TryFinally
self.visit(stmt)
File "/opt/pasta/pasta/base/annotate.py", line 1055, in visit
super(AstAnnotator, self).visit(node)
File "/opt/pasta/pasta/base/annotate.py", line 115, in visit
super(BaseVisitor, self).visit(node)
File "/home/william/miniconda3/envs/google_pasta_py27/lib/python2.7/ast.py", line 241, in visit
return visitor(node)
File "/opt/pasta/pasta/base/annotate.py", line 79, in wrapped
f(self, node, *args, **kwargs)
File "/opt/pasta/pasta/base/annotate.py", line 386, in visit_TryExcept
self.visit(stmt)
File "/opt/pasta/pasta/base/annotate.py", line 1055, in visit
super(AstAnnotator, self).visit(node)
File "/opt/pasta/pasta/base/annotate.py", line 115, in visit
super(BaseVisitor, self).visit(node)
File "/home/william/miniconda3/envs/google_pasta_py27/lib/python2.7/ast.py", line 241, in visit
return visitor(node)
File "/opt/pasta/pasta/base/annotate.py", line 43, in wrapped
f(self, node, *args, **kwargs)
File "/opt/pasta/pasta/base/annotate.py", line 477, in visit_Assign
self.visit(target)
File "/opt/pasta/pasta/base/annotate.py", line 1055, in visit
super(AstAnnotator, self).visit(node)
File "/opt/pasta/pasta/base/annotate.py", line 115, in visit
super(BaseVisitor, self).visit(node)
File "/home/william/miniconda3/envs/google_pasta_py27/lib/python2.7/ast.py", line 241, in visit
return visitor(node)
File "/opt/pasta/pasta/base/annotate.py", line 43, in wrapped
f(self, node, *args, **kwargs)
File "/opt/pasta/pasta/base/annotate.py", line 754, in visit_Name
self.token(node.id)
File "/opt/pasta/pasta/base/annotate.py", line 1118, in token
token_val, token.src, token.start[0], token.line))
pasta.base.annotate.AnnotationError: Expected 'error' but found 'try'
line 3: try:
cc @nicoddemus
re: @akov
It's legal python, and by principle #1, we need to be able to output exactly as it is read in. I plan to support it.
@williamjamir Thanks for the follow-up! Will work on fixing this.
Hi,
Running the parser against a file with "nested try" results in the following error:
I found this issue with
(In python 3.4.5 works just fine)
Test.py
Script.py:
Full Log: