Удалите кавычки из метода __repr__ в декораторе классов данных Python

#python #python-dataclasses

Вопрос:

При использовании dataclass декоратора в Python при определении класса значения полей, являющиеся строками, выводятся в строковом представлении этого объекта в кавычках. Смотрите скриншот ниже из dataclass документации (ссылка здесь):

введите описание изображения здесь

Вопрос в том, как мне удалить кавычки? Другими словами, как я могу наилучшим образом переопределить __repr__ метод, который поставляется с dataclass декоратором, чтобы внести это простое изменение? В соответствии с приведенным выше примером я хотел бы, чтобы результат выглядел так:

 InventoryItem(name=widget, unit_price=3.0, quantity_on_hand=10)
 

Комментарии:

1. repr() предполагается, что там, где это возможно, должна быть выдана строка, eval способная вернуть исходные данные. С этим изменением это будет неверно-вывод больше не будет допустимым синтаксисом Python.

2. repr это не та функция, которую следует использовать, если вам нужен точный контроль над выводом. Это средство отладки, немного больше.

3. в чем дело myrepr = f"{row}".replace("'","") ?

Ответ №1:

Вероятно, вам придется заменить __repr__ реализацию. Например:

 from dataclasses import dataclass, _FIELD, _recursive_repr


@dataclass
class InventoryItem:

    name: str
    unit_price: float
    quantity_on_hand: int

    @_recursive_repr
    def __repr__(self):
        # only get fields that actually exist and want to be shown in a repr
        fields = [k for k, v in self.__dataclass_fields__.items() if v._field_type is _FIELD and v.repr]
        return (
            self.__class__.__qualname__
              "("
            # fetch fields by name, and return their repr - except if they are strings
              ", ".join(f"{k}={getattr(self, k)}" if issubclass(type(k), str) else f"{k}={getattr(self, k)!r}" for k in fields)
              ")"
        )


item = InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)
print(item)
 

Результат:

 InventoryItem(name=widget, unit_price=3.0, quantity_on_hand=10)