homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: TypeError instead of SyntaxError for syntactically invalid gen exp
Type: Stage:
Components: None Versions: Python 2.5
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: amaury.forgeotdarc, jafo, ntc2
Priority: normal Keywords:

Created on 2008年03月05日 00:53 by ntc2, last changed 2022年04月11日 14:56 by admin. This issue is now closed.

Messages (3)
msg63273 - (view) Author: Nathan Collins (ntc2) * Date: 2008年03月05日 00:53
I have a file f1.py
$ cat f1.py
import os
(lambda **x:x)(**dict(y,y for y in ()))
and when I run it
$ python f1.py
Traceback (most recent call last):
 File "f1.py", line 1, in <module>
 import os
TypeError: 'int' object is not iterable
Notice that the TypeError exception is from the import os on line 1.
But the import isn't the problem. The problem is the illegal
generator expression on line 2. I.e. if
$ cat f2.py
#import os
dict(y,y for y in ())
then
$ python f2.py
 File "f2.py", line 2
 dict(y,y for y in ())
SyntaxError: Generator expression must be parenthesized if not sole argument
The mess
(lambda **x:x)(**dict(y,y for y in ()))
is a simplified version of something I had about 100 lines into a
file, but the resulting TypeError still complains about an import on
line 1, which is really confusing.
I'm using
Python 2.5.2 (r252:60911, Mar 4 2008, 14:33:51)
[GCC 3.4.4] on linux2
for python.
################################################################################
The above is probably a good enough description, but here's some more
weirdness in case it's helpful:
Some variations of f1.py cause the same error, but others don't.
E.g. if f4.py is
for c in [1]: pass
(lambda **x:x)(**dict(y,y for y in ()))
I get
Traceback (most recent call last):
 File "f4.py", line 1, in <module>
 for c in [1]: pass
TypeError: 'int' object is not iterable
as before. But if f5.py is
for c in "1": pass
(lambda **x:x)(**dict(y,y for y in ()))
running the script results in no output and a successful run
$ echo $?
0
Finally, if f6.py is just the single line
(lambda **x:x)(**dict(y,y for y in ()))
then my 2.5.2 python has the same successful with no output result as
for f5.py, but if I run f6.py in an older
Python 2.5 (r25:51908, Oct 30 2006, 16:20:39)
[GCC 3.4.4] on linux2
python I get
Exception exceptions.SyntaxError: ('Generator expression must be
parenthesized if not sole argument', 1) in 'garbage collection' ignored
Fatal Python error: unexpected exception during garbage collection
zsh: abort (core dumped) python f6.py
The older 2.5 python runs f5.py successfully with no output like 2.5.2 does.
I searched the bug tracker for "TypeError: 'int' object is not
iterable" and didn't find anything, so I'm assuming this bug is
unknown. I'm sure someone will let me know if I'm mistaken =)
I'd guess the problem has to do with a bad parse.
msg63274 - (view) Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * (Python committer) Date: 2008年03月05日 01:51
Interestingly, in debug mode, the message "XXX undetected error" is
printed to stderr.
And this gives the solution: in ast.c, some calls did not check the
return status.
Committed revision 61240, will backport to 2.5.
Thanks for the report!
Thanks for the report!
msg64184 - (view) Author: Sean Reifschneider (jafo) * (Python committer) Date: 2008年03月20日 17:40
Back-ported to 2.5 and committed in rev 61675.
History
Date User Action Args
2022年04月11日 14:56:31adminsetgithub: 46491
2008年03月20日 17:40:02jafosetstatus: pending -> closed
priority: normal
messages: + msg64184
nosy: + jafo
2008年03月05日 01:51:11amaury.forgeotdarcsetstatus: open -> pending
resolution: fixed
messages: + msg63274
nosy: + amaury.forgeotdarc
2008年03月05日 00:53:15ntc2create

AltStyle によって変換されたページ (->オリジナル) /