Release Notes

0.9.0 - in development

Bug fixes

  • Use codeobj.__name__ in the key for the internal cache of astor.file_util.CodeToAst rather than the line number to prevent KeyError. (Reported and fixed by David Charboneau in Issue 174 and PR 175.)
  • Change formatting of function and assignment type annotations to be more PEP 8 friendly. (Contributed by Venkatesh-Prasad Ranganath in PR 170.)
  • Include parentheses for keyword unpacking when syntactically required. (Contributed by Kodi Arfer in PR 202.)

0.8.1 - 2019-12-10

Bug fixes

  • Fixed precedence issue for f-string expressions that caused redundant parenthesis around expression. (Reported by Ilya Kamenshchikov in Issue 153 and fixed by Batuhan Taskaya in PR 155.)
  • Fixed astor.to_source() incorrectly checking whether source_generator_class is a subclass of astor.code_gen.SourceGenerator. (Reported by Yu-Chia “Hank” Liu in Issue 158 and fixed by Will Crichton in PR 164.)
  • Fixed TypeError when AST nodes with unicode strings are passed to astor.to_source(). (Reported and fixed by Dominik Moritz in PR 154.)
  • Fixed installation issue with setuptools 41.4.0 or later due to the use of an undocumented feature. (Reported and fixed by Jonathan Ringer in Issue 162 and PR 163.)

0.8.0 - 2019-05-19

New features

  • Support ast.Constant nodes being emitted by Python 3.8 (and initially created in Python 3.6). (Reported and fixed by Chris Rink in Issue 120 and PR 121.)
  • Support Python 3.8’s assignment expressions. (Reported and fixed by Kodi Arfer in Issue 126 and PR 134.)
  • Support Python 3.8’s f-string debugging syntax. (Reported and fixed by Batuhan Taskaya in Issue 138 and PR 139.)
  • astor.to_source() now has a source_generator_class parameter to customize source code generation. (Reported and fixed by matham in Issue 113 and PR 114.)
  • The SourceGenerator class can now be imported from the astor package directly. Previously, the astor.code_gen submodule was needed to be imported.
  • Support Python 3.8’s positional only arguments. See PEP 570 for more details. (Reported and fixed by Batuhan Taskaya in Issue 142 and PR 143.)

Bug fixes

  • Fix string parsing when there is a newline inside an f-string. (Reported by Adam Cécile in Issue 119 and fixed by Felix Yan in PR 123.)
  • Fixed code generation with escaped braces in f-strings. (Reported by Felix Yan in Issue 124 and fixed by Kodi Arfer in PR 125.)
  • Fixed code generation with attributes of integer literals, and with u-prefixed string literals. (Fixed by Kodi Arfer in PR 133.)
  • Fixed code generation with very large integers. (Reported by Adam Kucz in Issue 127 and fixed by Kodi Arfer in PR 130.)
  • Fixed astor.tree_walk.TreeWalk when attempting to access attributes created by Python’s type system (such as __dict__ and __weakref__) (Reported and fixed by esupoff in Issue 136 and PR 137.)

0.7.1 - 2018-07-06

Bug fixes

  • Fixed installation error by adding the helper to the sdist. (Reported by Adam and fixed by Berker Peksag in Issue 116.)

0.7.0 - 2018-07-05

New features

  • Added initial support for Python 3.7.0.

    Note that if you have a subclass of astor.code_gen.SourceGenerator, you may need to rename the keyword argument async of the following methods to is_async:

    • visit_FunctionDef(..., is_async=False)
    • visit_For(..., is_async=False)
    • visit_With(..., is_async=False)

    (Reported and fixed by Berker Peksag in Issue 86.)

  • Dropped support for Python 2.6 and Python 3.3.

Bug fixes

  • Fixed a bug where newlines would be inserted to a wrong place during printing f-strings with trailing newlines. (Reported by Felix Yan and contributed by Radomír Bosák in Issue 89.)
  • Improved code generation to support ast.Num nodes containing infinities or NaNs. (Reported and fixed by Kodi Arfer in Issue 85 and Issue 100.)
  • Improved code generation to support empty sets. (Reported and fixed by Kodi Arfer in Issue 108.)

0.6.2 - 2017-11-11

Bug fixes

  • Restore backwards compatibility that was broken after 0.6.1. You can now continue to use the following pattern:

    import astor
    class SpamCodeGenerator(astor.codegen.SourceGenerator):

    (Reported by Dan Moldovan and fixed by Berker Peksag in Issue 87.)

0.6.1 - 2017-11-11

New features

  • Added astor.parse_file() as an alias to astor.code_to_ast.parsefile(). (Contributed by Berker Peksag.)

Bug fixes

  • Fix compatibility layer for the astor.codegen submodule. Importing astor.codegen now succeeds and raises a DeprecationWarning instead of ImportError. (Contributed by Berker Peksag.)

0.6 - 2017-10-31

New features

  • New astor.rtrip command-line tool to test round-tripping of Python source to AST and back to source. (Contributed by Patrick Maupin.)

  • New pretty printer outputs much better looking code:

    • Remove parentheses where not necessary
    • Use triple-quoted strings where it makes sense
    • Add placeholder for function to do nice line wrapping on output

    (Contributed by Patrick Maupin.)

  • Additional Python 3.5 support:

    • Additional unpacking generalizations (PEP 448)
    • Async and await (PEP 492)

    (Contributed by Zack M. Davis.)

  • Added Python 3.6 feature support:

    (Contributed by Ryan Gonzalez.)

  • Code cleanup, including renaming for PEP8 and deprecation of old names. See Deprecations for more information. (Contributed by Leonard Truong in Issue 36.)

Bug fixes

  • Don’t put trailing comma-spaces in dictionaries. astor will now create {'three': 3} instead of {'three': 3, }. (Contributed by Zack M. Davis.)

  • Fixed several bugs in code generation:

    1. Keyword-only arguments should come before **
    2. from .. import <member> with no trailing module name did not work
    3. Support from .. import foo as bar syntax
    4. Support with foo: ..., with foo as bar: ... and with foo, bar as baz: ... syntax
    5. Support 1eNNNN syntax
    6. Support return (yield foo) syntax
    7. Support unary operations such as -(1) + ~(2) + +(3)
    8. Support if (yield): pass
    9. Support if (yield from foo): pass
    10. try...finally block needs to come after the try...else clause
    11. Wrap integers with parentheses where applicable (e.g. (0).real should generated)
    12. When the yield keyword is an expression rather than a statement, it can be a syntax error if it is not enclosed in parentheses
    13. Remove extraneous parentheses around yield from

    (Contributed by Patrick Maupin in Issue 27.)

0.5 - 2015-04-18

New features

  • Added support for Python 3.5 infix matrix multiplication (PEP 465) (Contributed by Zack M. Davis.)

0.4.1 - 2015-03-15

Bug fixes

  • Added missing SourceGenerator.visit_arguments()

0.4 - 2014-06-29

New features

  • Added initial test suite and documentation

Bug fixes

  • Added a visitor for NameConstant

0.3 - 2013-12-10

New features

  • Added support for Python 3.3.
    • Added YieldFrom
    • Updated Try and With.

Bug fixes

  • Fixed a packaging bug on Python 3 – see pull requests #1 and #2 for more information.

0.2.1 – 2012-09-20


  • Modified TreeWalk to add _name suffix for functions that work on attribute names

0.2 – 2012-09-19


  • Initial Python 3 support
  • Test of treewalk

0.1 – 2012-09-19

  • Initial release
  • Based on Armin Ronacher’s codegen
  • Several bug fixes to that and new tree walker