New submission from Angus L'Herrou <pir...@brandeis.edu>:

The f-string grammar clearly specifies the correct order of f-string =, !, and 
: specifiers:

replacement_field ::=  "{" f_expression ["="] ["!" conversion] [":" 
format_spec] "}"

However, when these components are used in the wrong order, the error messages, 
while understandable if you know the grammar, are not exactly helpful for users 
of all knowledge levels.


>>> foo = 12.345
>>> f'{foo=:.2f}'  # correct ordering of = and :
'foo=12.35'
>>> f'{foo:.2f=}'  # incorrect ordering of : and =
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier
>>> f'{foo=!r}'    # correct ordering of = and !
'foo=12.345'
>>> f'{foo!r=}'    # incorrect ordering of ! and =
  File "<stdin>", line 1
SyntaxError: f-string: expecting '}'
>>> bar = 'abcd'
>>> f'{bar!r:.2s}' # correct ordering of ! and :
"'a"
>>> f'{bar:.2s!r}' # incorrect ordering of : and !
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier


It would be more helpful to have more descriptive error messages specifying the 
correct order of these features. f-string format specifiers, especially ! and 
=, are in my experience fairly poorly known features, and more descriptive 
feedback when they are used incorrectly would avoid discouraging users from 
using them at all upon encountering a cryptic error. 

Since __format__ can have an arbitrary implementation for different data types, 
and therefore there might be some user-defined class that accepts :.2f!r as a 
valid format specifier, the ValueErrors here might have to stay, but at least 
the SyntaxError from f'{foo!r=}' could be clearer.

----------
components: Parser
messages: 393587
nosy: angus-lherrou, lys.nikolaou, pablogsal
priority: normal
severity: normal
status: open
title: Unhelpful SyntaxError message with mis-ordering of f-string specifiers
type: enhancement
versions: Python 3.10, Python 3.11, Python 3.8, Python 3.9

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

Reply via email to