все Python 3Ввод и выводпонятие
repr() vs str()
строки
str() — читаемое представление объекта для пользователя, repr() — однозначное, для разработчика и отладки; консоль показывает repr.
Синтаксис
str(object) repr(object)
Внутри контейнеров элементы всегда показываются через repr — поэтому print("привет") даёт голый текст, а print(["привет"]) выводит строку в кавычках, и это не баг. В своих классах достаточно определить __repr__: если __str__ нет, str() и print() падают обратно на него, а вот обратной подстановки не бывает. В f-строках отладочное представление включается суффиксом !r.
Примеры
print(str("привет")) # → привет
print(repr("привет")) # → 'привет'
print(str(None)) # → None
print(repr(None)) # → None
print(str([1, 2])) # → [1, 2]
print(repr([1, 2])) # → [1, 2]
class Point:
def __init__(self, x, y):
self.x = x; self.y = y
def __repr__(self):
return f'Point({self.x}, {self.y})'
def __str__(self):
return f'({self.x}, {self.y})'
p = Point(3, 4)
print(p) # → (3, 4) — __str__
print(repr(p)) # → Point(3, 4) — __repr__
# Если только __repr__ — используется и для str
class Vec:
def __init__(self, x, y):
self.x = x; self.y = y
def __repr__(self):
return f'Vec({self.x},{self.y})'
print(Vec(1,2)) # → Vec(1,2)
class Fraction:
def __init__(self, n, d):
self.n = n; self.d = d
def __str__(self):
return f'{self.n}/{self.d}'
def __repr__(self):
return f'Fraction({self.n}, {self.d})'
f = Fraction(1, 3)
print(f) # → 1/3
print(repr(f)) # → Fraction(1, 3)
# В списках используется __repr__
p2 = Point(1, 2)
print([p2]) # → [Point(1, 2)]
class Temperature:
def __init__(self, c):
self.c = c
def __repr__(self):
return f'Temperature({self.c})'
def __str__(self):
return f'{self.c}°C'
t = Temperature(100)
print(str(t), repr(t)) # → 100°C Temperature(100)
# f-string использует __str__
print(f'{Point(1,2)}') # → (1, 2)
print(f'{Point(1,2)!r}') # → Point(1, 2)
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности