diff options
| author | Mark Dickinson <mdickinson@enthought.com> | 2012-05-06 17:35:19 +0100 | 
|---|---|---|
| committer | Mark Dickinson <mdickinson@enthought.com> | 2012-05-06 17:35:19 +0100 | 
| commit | fe8440aec00af5bc2e995aaad205efa2e693a364 (patch) | |
| tree | 853a6812968c57038f4e1afdaf94b27b54d0a822 | |
| parent | 6dbca367dceda3999979bdc3cdcfdb201f40d044 (diff) | |
| parent | 1b2e9444fe9eeaef971d498445ebad7fce27f0b9 (diff) | |
| download | cpython-git-fe8440aec00af5bc2e995aaad205efa2e693a364.tar.gz | |
Issue #14965:  Bring Tools/parser/unparse.py up to date with the Python 3.3. Grammar.
| -rw-r--r-- | Misc/NEWS | 6 | ||||
| -rw-r--r-- | Tools/parser/test_unparse.py | 31 | ||||
| -rw-r--r-- | Tools/parser/unparse.py | 42 | 
3 files changed, 60 insertions, 19 deletions
@@ -28,6 +28,12 @@ Library  - Issue #14127 and #10148: shutil.copystat now preserves exact mtime and atime    on filesystems providing nanosecond resolution. +Tools/Demos +----------- + +- Issue #14965: Bring Tools/parser/unparse.py support up to date with +  the Python 3.3 Grammar. +  What's New in Python 3.3.0 Alpha 3?  =================================== diff --git a/Tools/parser/test_unparse.py b/Tools/parser/test_unparse.py index d457523b7c..647366c93d 100644 --- a/Tools/parser/test_unparse.py +++ b/Tools/parser/test_unparse.py @@ -93,6 +93,21 @@ finally:      suite5  """ +with_simple = """\ +with f(): +    suite1 +""" + +with_as = """\ +with f() as x: +    suite1 +""" + +with_two_items = """\ +with f() as x, g() as y: +    suite1 +""" +  class ASTTestCase(unittest.TestCase):      def assertASTEqual(self, ast1, ast2):          self.assertEqual(ast.dump(ast1), ast.dump(ast2)) @@ -209,6 +224,22 @@ class UnparseTestCase(ASTTestCase):      def test_try_except_finally(self):          self.check_roundtrip(try_except_finally) +    def test_starred_assignment(self): +        self.check_roundtrip("a, *b, c = seq") +        self.check_roundtrip("a, (*b, c) = seq") +        self.check_roundtrip("a, *b[0], c = seq") +        self.check_roundtrip("a, *(b, c) = seq") + +    def test_with_simple(self): +        self.check_roundtrip(with_simple) + +    def test_with_as(self): +        self.check_roundtrip(with_as) + +    def test_with_two_items(self): +        self.check_roundtrip(with_two_items) + +  class DirectoryTestCase(ASTTestCase):      """Test roundtrip behaviour on all files in Lib and Lib/test.""" diff --git a/Tools/parser/unparse.py b/Tools/parser/unparse.py index e96ef5477b..9ae5b46949 100644 --- a/Tools/parser/unparse.py +++ b/Tools/parser/unparse.py @@ -147,6 +147,14 @@ class Unparser:              self.dispatch(t.value)          self.write(")") +    def _YieldFrom(self, t): +        self.write("(") +        self.write("yield from") +        if t.value: +            self.write(" ") +            self.dispatch(t.value) +        self.write(")") +      def _Raise(self, t):          self.fill("raise")          if not t.exc: @@ -158,12 +166,11 @@ class Unparser:              self.write(" from ")              self.dispatch(t.cause) -    def _TryExcept(self, t): +    def _Try(self, t):          self.fill("try")          self.enter()          self.dispatch(t.body)          self.leave() -          for ex in t.handlers:              self.dispatch(ex)          if t.orelse: @@ -171,22 +178,12 @@ class Unparser:              self.enter()              self.dispatch(t.orelse)              self.leave() - -    def _TryFinally(self, t): -        if len(t.body) == 1 and isinstance(t.body[0], ast.TryExcept): -            # try-except-finally -            self.dispatch(t.body) -        else: -            self.fill("try") +        if t.finalbody: +            self.fill("finally")              self.enter() -            self.dispatch(t.body) +            self.dispatch(t.finalbody)              self.leave() -        self.fill("finally") -        self.enter() -        self.dispatch(t.finalbody) -        self.leave() -      def _ExceptHandler(self, t):          self.fill("except")          if t.type: @@ -296,10 +293,7 @@ class Unparser:      def _With(self, t):          self.fill("with ") -        self.dispatch(t.context_expr) -        if t.optional_vars: -            self.write(" as ") -            self.dispatch(t.optional_vars) +        interleave(lambda: self.write(", "), self.dispatch, t.items)          self.enter()          self.dispatch(t.body)          self.leave() @@ -472,6 +466,10 @@ class Unparser:          self.dispatch(t.slice)          self.write("]") +    def _Starred(self, t): +        self.write("*") +        self.dispatch(t.value) +      # slice      def _Ellipsis(self, t):          self.write("...") @@ -560,6 +558,12 @@ class Unparser:          if t.asname:              self.write(" as "+t.asname) +    def _withitem(self, t): +        self.dispatch(t.context_expr) +        if t.optional_vars: +            self.write(" as ") +            self.dispatch(t.optional_vars) +  def roundtrip(filename, output=sys.stdout):      with open(filename, "rb") as pyfile:          encoding = tokenize.detect_encoding(pyfile.readline)[0]  | 
