Łukasz Langa <luk...@langa.pl> added the comment:

Inadasan, what Francis is referring to is that people often use `ast.parse()` 
to parse code fragments, not entire modules.

For example:

  >>> some_code = '"just a string"'
  >>> some_code_ast = ast.parse(some_code)

The way `ast.parse()` works, it always considers the input to be a module:

  >>> some_code_ast
  <_ast.Module object at 0x109537a18>

Before Python 3.7, you could parse out a string from such "module":

  >>> some_code.body
  [<_ast.Expr object at 0x1079aaa20>]
  >>> some_code.body[0].value
  <_ast.Str object at 0x107a45198>

However, starting with Python 3.7, this module is empty:

  >>> some_code_ast.body
  []
  >>> some_code_ast.docstring
  'just a string'

`ast.literal_eval()` does not have this problem.


And now: where is the bug?  I think the user code has a bug trying to parse a 
code fragment with `mode="exec"`.  Instead of using the default `mode="exec"`, 
it seems to me `mode="single"` fits the bill better.  In some cases the 
programmer might prefer `mode="eval"` if they don't want to allow statements at 
all.

Inadasan, I think what we should do is to amend `ast.parse()` and `compile()` 
docs that mode="exec" treats given code as a module, we should even give the 
docstring handling as an example.

Francis, if your use case requires passing multiple statements/expressions at 
once and a string in the first statement has semantic meaning, please provide 
us with a concrete example.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue32911>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to