Jython @property SyntaxError: mismatched input 

2019-05-26 20:08发布

问题:

I tried to run this example from the docs in the Jython interpreter:

http://www.jython.org/docs/library/functions.html

class C(object):
    def __init__(self):
        self._x = None
    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x
    @x.setter
    def x(self, value):
        self._x = value
    @x.deleter
    def x(self):
        del self._x

Just entering the first 4 lines (up to and including @property) yields a SyntaxError:

>>> class C(object):
...     def __init__(self):
...         self._x = None
...     @property
  File "<stdin>", line 4
    @property
            ^
SyntaxError: mismatched input '' expecting CLASS

Update: I am on Jython 2.5.2

Here's what happens when I paste the whole thing:

$ jython
Jython 2.5.2 (Debian:hg/91332231a448, Jun 3 2012, 09:02:34) 
[Java HotSpot(TM) 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0_45
Type "help", "copyright", "credits" or "license" for more information.
>>> class C(object):
...     def __init__(self):
...         self._x = None
...     @property
  File "<stdin>", line 4
    @property
            ^
SyntaxError: mismatched input '' expecting CLASS
>>>     def x(self):
  File "<stdin>", line 1
    def x(self):
    ^
SyntaxError: no viable alternative at input '    '
>>>         """I'm the 'x' property."""
  File "<stdin>", line 1
    """I'm the 'x' property."""
    ^
SyntaxError: no viable alternative at input '        '
>>>         return self._x
  File "<stdin>", line 1
    return self._x
    ^
SyntaxError: no viable alternative at input '        '
>>>     @x.setter
  File "<stdin>", line 1
    @x.setter
    ^
SyntaxError: no viable alternative at input '    '
>>>     def x(self, value):
  File "<stdin>", line 1
    def x(self, value):
    ^
SyntaxError: no viable alternative at input '    '
>>>         self._x = value
  File "<stdin>", line 1
    self._x = value
    ^
SyntaxError: no viable alternative at input '        '
>>>     @x.deleter
  File "<stdin>", line 1
    @x.deleter
    ^
SyntaxError: no viable alternative at input '    '
>>>     def x(self):
  File "<stdin>", line 1
    def x(self):
    ^
SyntaxError: no viable alternative at input '    '
>>>         del self._x
  File "<stdin>", line 1
    del self._x
    ^
SyntaxError: no viable alternative at input '        '
>>> 

Update 2: Thanks!

For people that have control over which Jython version, upgrade to 2.5.3. For those who don't have control over it, use the old style syntax without the decorators:

class C(object):
    def __init__(self):
        self._x = None
    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

回答1:

It's a bug of jython 2.5.2, see this issue.

Fixed in jython version 2.5.3, try 2.5.3, it works.



回答2:

You can only execute one statement in the interactive interpreter, otherwise it's a syntax error. Have you tried executing the whole thing?

>>> class C(object):
    def __init__(self):
        self._x = None
    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x
    @x.setter
    def x(self, value):
        self._x = value
    @x.deleter
    def x(self):
        del self._x

Or just save this to a file, and run the file.