фракции. Фракции f-строк как плавающие с __format__ - PullRequest
4 голосов
/ 17 мая 2019

При использовании fraction.Fraction в f-строке я ожидал, что смогу отформатировать его как float. Однако я получаю TypeError:

from fractions import Fraction
f = Fraction(11/10)
f'{f} as float {f:.3f}'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported format string passed to Fraction.__format__

Казалось бы, спецификации формата с плавающей запятой могут / должны поддерживаться для Fractions.

Интересно, они для Decimal:

from decimal import Decimal
f = Decimal('1.1')
f'{f} as float {f:.3f}'

Есть причина, по которой это не работает для Fraction?

И да, я знаю, что могу сделать f'{f} as float {float(f):.3f}', но я спрашиваю, зачем это нужно.

1 Ответ

1 голос
/ 17 мая 2019

Если вы не реализуете метод __format__ в своем классе, то вы автоматически получаете форматтер по умолчанию, который просто применяет метод str. Рассмотрим

class MyClass:
    """A simple example class"""

    def __str__(self):
        return 'hello world'

Если я сделаю

x = MyClass()
y = f"{x}"

тогда y будет иметь значение "Hello World". Это потому, что я получаю форматтер по умолчанию, который вызывает мой __str__.

Я подозреваю, что это так с классом Fraction, потому что, когда вы делаете help(Fraction.__format__) Вы получаете

Help on method_descriptor:

__format__(self, format_spec, /)
    Default object formatter.
...