classification
Title: bug in %-formatting in Python, related to escaped %-characters
Type: behavior Stage:
Components: Interpreter Core Versions: Python 3.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: Carl.Friedrich.Bolz, SilentGhost, serhiy.storchaka
Priority: normal Keywords:

Created on 2020-01-29 14:49 by Carl.Friedrich.Bolz, last changed 2020-01-29 17:21 by SilentGhost.

Messages (3)
msg360965 - (view) Author: Carl Friedrich Bolz-Tereick (Carl.Friedrich.Bolz) * Date: 2020-01-29 14:49
The following behaviour of %-formatting changed between Python3.6 and Python3.7, and is in my opinion a bug that was introduced.

So far, it has been possible to add conversion flags to a conversion specifier in %-formatting, even if the conversion is '%' (meaning a literal % is emitted and no argument consumed).

Eg this works in Python3.6:

>>>> "%+%abc% %" % ()
'%abc%'

The conversion flags '+' and ' ' are ignored.

Was it discussed and documented anywhere that this is now an error? Because Python3.7 has the following strange behaviour instead:

>>> "%+%abc% %" % ()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string

That error message is just confusing, because the amount of arguments is not the problem here. If I pass a dict (thus making the number of arguments irrelevant) I get instead:

>>> "%+%abc% %" % {}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: unsupported format character '%' (0x25) at index 2

(also a confusing message, because '%' is a perfectly fine format character)

In my opinion this behaviour should either be reverted to how Python3.6 worked, or the new restrictions should be documented and the error messages improved.
msg360974 - (view) Author: SilentGhost (SilentGhost) * (Python triager) Date: 2020-01-29 16:50
This seemed to be a consequence of #29568.
msg360977 - (view) Author: Carl Friedrich Bolz-Tereick (Carl.Friedrich.Bolz) * Date: 2020-01-29 17:18
Ok, that means it's intentional. I still think it's missing a documentation change and consistent error messages.
History
Date User Action Args
2020-01-29 17:21:01SilentGhostsetnosy: + serhiy.storchaka
2020-01-29 17:18:40Carl.Friedrich.Bolzsetmessages: + msg360977
2020-01-29 16:50:30SilentGhostsetnosy: + SilentGhost
messages: + msg360974

components: + Interpreter Core
type: behavior
2020-01-29 14:49:09Carl.Friedrich.Bolzcreate