This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: lib2to3 should parse f-strings
Type: Stage: resolved
Components: 2to3 (2.x to 3.x conversion tool) Versions: Python 3.8, Python 3.7, Python 3.6
process
Status: closed Resolution: wont fix
Dependencies: Superseder: Close 2to3 issues and list them here
View: 45544
Assigned To: Nosy List: benjamin.peterson, eric.smith, skreft, steven.daprano
Priority: normal Keywords:

Created on 2018-06-28 22:16 by skreft, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (5)
msg320687 - (view) Author: (skreft) Date: 2018-06-28 22:16
Currently f-strings are parsed just as regular strings by lib2to3. However, this has the problem that the invariant of a string node being a literal is now broken.

This poses two problems. On one hand, if I want to compare that two string nodes are equivalent I would need to do something like:

def string_nodes_are_eqivalent(node1, node2):
  if is_f_string(node1) and is_f_string(node2):
    # This would require to parse the nodes using ast.parse
    return f_strings_are_equivalent(node1, node2)
  if not is_f_string(node1) and not is_f_string(node2):
    return ast.literal_eval(node1.value) == ast.literal_eval(node2.value)
  return False

Note that ast.literal_eval does not accept f-strings.
Also note that ast.parse returns an ast.JoinedString for f-strings, whose elements are either ast.Str or ast.FormattedValue, the latter being ast expressions.

On the other hand, this has the problem of not being able to refactor the expressions inside an f-string.
msg320691 - (view) Author: Steven D'Aprano (steven.daprano) * (Python committer) Date: 2018-06-29 00:09
I'm curious how you are getting f-strings (introduced in Python 3.6) in Python 2 code that you are passing to 2to3.
msg320707 - (view) Author: (skreft) Date: 2018-06-29 09:13
@Steven lib2to3 is no longer specifically for python 2 code, it also parses python 3 code and is the building block of tools like YAPF.

See Eli's comment on this https://bugs.python.org/issue23894: "AFAIK lib2to3 has been repurposed to parse Python 3 as well - it has certainly gained quite a bit of support for that".

I added the versions 3.6-3.8 as previous ones are not able to parse f-strings.
msg320711 - (view) Author: Steven D'Aprano (steven.daprano) * (Python committer) Date: 2018-06-29 11:06
> @Steven lib2to3 is no longer specifically for python 2 code, it also 
> parses python 3 code

Ah, all good then. Thanks.
msg320790 - (view) Author: (skreft) Date: 2018-06-30 16:21
Note also, that lib2to3 will parse invalid f-strings like f"hello {", whereas ast.parse will raise a SyntaxError exception.


See below for reproduction cases:
In [2]: lib2to3.tests.support.parse_string('f"hello {"')
Out[2]: Node(file_input, [Node(simple_stmt, [Leaf(3, 'f"hello {"'), Leaf(4, '\n')]), Leaf(0, '')])

In [4]: ast.parse('f"hello {"')
Traceback (most recent call last):

  File "/Users/skreft/.virtualenvs/pyfaster/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  File "<ipython-input-4-78a4f2773f7f>", line 1, in <module>
    ast.parse('f"hello {"')

  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)

  File "<unknown>", line 1
SyntaxError: f-string: expecting '}'
History
Date User Action Args
2022-04-11 14:59:02adminsetgithub: 78172
2021-10-20 22:50:46iritkatrielsetstatus: open -> closed
superseder: Close 2to3 issues and list them here
resolution: wont fix
stage: resolved
2018-06-30 16:21:18skreftsetmessages: + msg320790
2018-06-29 11:06:01steven.dapranosetmessages: + msg320711
2018-06-29 09:13:36skreftsetmessages: + msg320707
versions: + Python 3.6, Python 3.7, Python 3.8
2018-06-29 06:38:08serhiy.storchakasetnosy: + eric.smith, benjamin.peterson
components: + 2to3 (2.x to 3.x conversion tool)
2018-06-29 00:09:51steven.dapranosetnosy: + steven.daprano
messages: + msg320691
2018-06-28 22:16:04skreftcreate