Lack of whitespace between contain operator ("in") and other expression tokens doesn't result in SyntaxError: bug or feature?

Garrett Cooper yanegomi at gmail.com
Thu May 3 14:49:29 EDT 2012


Hi Python folks!
    I came across a piece of code kicking around a sourcebase that
does something similar to the following:

>>> START >>>>
#!/usr/bin/env python

import sys

def foo():
    bar = 'abcdefg'
    foo = [ 'a' ]

    # Should throw SyntaxError?
    for foo[0]in bar:
        sys.stdout.write('%s' % foo[0])
    sys.stdout.write('\n')
    sys.stdout.write('%s\n' % (str(foo)))
    # Should throw SyntaxError?
    if foo[0]in bar:
        return True
    return False

sys.stdout.write('%r\n' % (repr(sys.version_info)))
sys.stdout.write('%s\n' % (str(foo())))
>>> END >>>>

    I ran it against several versions of python to ensure that it
wasn't a regression or fixed in a later release:

$ /scratch/bin/bin/python ~/test_bad_in.py
"(2, 3, 7, 'final', 0)"
abcdefg
['g']
True
$ python2.7 ~/test_bad_in.py
"sys.version_info(major=2, minor=7, micro=3, releaselevel='final', serial=0)"
abcdefg
['g']
True
$ python3.2 ~/test_bad_in.py
"sys.version_info(major=3, minor=2, micro=3, releaselevel='final', serial=0)"
abcdefg
['g']
True
$ uname -rom
FreeBSD 9.0-STABLE amd64
$

    And even tried a different OS, just to make sure it wasn't a
FreeBSD thing...

% python test_bad_in.py
"(2, 6, 5, 'final', 0)"
abcdefg
['g']
True
% uname -rom
2.6.32-71.el6.x86_64 x86_64 GNU/Linux

    I was wondering whether this was a parser bug or feature (seems
like a bug, in particular because it implicitly encourages bad syntax,
but I could be wrong). The grammar notes (for 2.7 at least [1]) don't
seem to explicitly require a space between 'in' and another parser
token (reserved work, expression, operand, etc), but I could be
misreading the documentation.
Thanks!
-Garrett

1. http://docs.python.org/reference/grammar.html



More information about the Python-list mailing list