mypy icon indicating copy to clipboard operation
mypy copied to clipboard

Basic checking of format string compatibility in f-strings

Open nielsbuwen opened this issue 1 year ago • 2 comments

Feature

Mypy should check whether format strings in f-strings make sense in basic cases.

Pitch

Consider this minimal example

print(f"{123:xyz}")

This fails at runtime with

Value Error: Invalid format specifier 'xyz' for object of type 'int'

But mypy does not find any problems.

Why is this a problem? Here is my real-world example:

In a temperature controlling function, we logged the current temperature vs the required temperature. Everything worked. Then we introduced a custom class Temperature to keep track of the unit (celsius in our case). We changed every function that accepted a float before to now accept a Temperature. Mypy was very helpful for this.

But unfortunately it did not warn about the logging calls that rounded the temperature to three digits:

print(f"Temperature now is {t:.3f}")

With t being a float this worked flawlessly and horribly broke at runtime when we changed the type of t to Temperature.

So my feature request consists of these parts:

  • forbid any format specifier for custom classes that don't implement __format__
  • validate static format specifiers for known types like float, int

If someone can point me to the right files, i can try to implement this myself.

nielsbuwen avatar Aug 28 '24 14:08 nielsbuwen

validate static format specifiers for known types like float, int

I can't imagine this is very simple.

However it's definitely possible to check for __format__! I'm not sure what exact files are useful to check.

A5rocks avatar Aug 28 '24 23:08 A5rocks

I think mypy actually supports this for .format calls, but not for f-strings. So hopefully shouldn't be too hard to get it working. Try looking at checkstrformat.py and checkexpr.py

hauntsaninja avatar Aug 29 '24 01:08 hauntsaninja

Related / duplicate: #11723

brianschubert avatar Sep 27 '24 01:09 brianschubert