#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)