Строковое представление объектов Python: от str до JSON
Основные способы преобразования объектов в строку
Как получить строковое представление любого объекта без специальных модулей?
В Python базовыми инструментами служат функции str() и repr(). str() ориентирована на чтение человеком, а repr() - на однозначное восстановление объекта (если это возможно). Пример:
>>> print(str(100))
>>> print(repr(100))
>>> print(str('текст'))
>>> print(repr('текст'))Python strip (метод strip в python)
100 100 текст 'текст'
Python повторить строку (повторение строки в python)
Для пользовательских классов достаточно определить методы __str__ и __repr__. Если __str__ отсутствует, Python использует __repr__.
__repr__, и при отладке видят неинформативную строку вида <__main__.MyObject object at 0x...>. Решение: всегда определять оба метода, хотя бы __repr__.Как сериализовать словарь или список в строку для хранения или передачи?
Модуль json позволяет преобразовать в JSON-строку:
import json
data = {'name': 'Анна', 'scores': [90, 85, 92]}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)Tuple в str python (преобразование кортежа в строку в python)
{"name": "Анна", "scores": [90, 85, 92]}Python объект в строку (преобразование объекта в строку в python)
TypeError: Object of type datetime is not JSON serializable появляется, если в данных есть нестандартные типы. Решение: использовать параметр default, например, default=str или собственный обработчик.Как вставить значение объекта в строку с заданным форматом?
f-строки и метод format() дают гибкое форматирование:
pi = 3.14159265
name = 'круг'
s = f"{name}: {pi:.2f}"
print(s)
s2 = "{0}: {1:.2f}".format(name, pi)
print(s2)Python convert string (преобразование строк в python)
круг: 3.14 круг: 3.14
Python str to bytes (преобразование строки в байты в python)
Как получить отладочное представление объекта с максимальной информацией?
Функция repr() возвращает детальное строковое представление. Для больших структур удобен pprint.pformat():
from pprint import pformat
nested = {'a': [1, 2, {'b': 3}]}
print(pformat(nested, depth=2, width=40))функция разделить python (разделение строки на список в python)
{'a': [1, 2, {'b': 3}]}вывести символ строки python (вывод символа строки в python)
pprint может вызвать RecursionError. Решение: ограничить глубину параметром depth.Как преобразовать байтовую строку (bytes) в текстовую строку?
Метод decode() с указанием кодировки:
b = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
text = b.decode('utf-8')
print(text)
# или str(b, 'utf-8')
print(str(b, 'utf-8'))вывести длину строки python (вывести длину строки в python)
Привет Привет
вывести элемент строки python (вывод конкретного символа строки по индексу в python)
UnicodeDecodeError возникает при несовпадении кодировки. Решение: передать параметр errors='replace' или 'ignore', либо определить верную кодировку.Как привести объект к строке с кастомным представлением для пользовательского класса?
Переопределив __str__ и __repr__, можно контролировать вывод:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person({self.name}, {self.age})"
def __repr__(self):
return f"Person('{self.name}', {self.age})"
p = Person('Иван', 25)
print(str(p))
print(repr(p))задания на строки python (задания на строки в python)
Person(Иван, 25)
Person('Иван', 25)
__repr__ возвращает строку, по которой невозможно восстановить объект, это вводит в заблуждение. Рекомендуется следовать соглашению: __repr__ должен быть однозначным.Расширенные примеры преобразования объектов в строку
1. Сериализация dataclass в JSON с поддержкой datetime
import json
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class Event:
title: str
date: datetime
def custom_serializer(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Object of type {type(obj)} is not serializable")
event = Event('Встреча', datetime(2024, 12, 31, 18, 0))
json_str = json.dumps(asdict(event), default=custom_serializer, ensure_ascii=False, indent=2)
print(json_str)
{
"title": "Встреча",
"date": "2024-12-31T18:00:00"
}
Как обработать дату и время при JSON-сериализации?
2. repr() для рекурсивных структур с ограничением глубины
import reprlib
# создадим рекурсивный список
lst = [1, 2, 3]
lst.append(lst) # зацикливание
repr_obj = reprlib.repr(lst)
print(repr_obj)
[1, 2, 3, [...]]
Модуль reprlib автоматически ограничивает глубину, избегая RecursionError. Это полезно при логгировании сложных структур.
repr() уходит в бесконечную рекурсию. Используйте reprlib.repr().3. Форматирование чисел с различными стилями (проценты, валюта)
value = 0.123456
print(f"Проценты: {value:.1%}")
print(f"Валюта: {value * 1000:,.2f} руб.")
print(f"Экспонента: {value:.3e}")
Проценты: 12.3% Валюта: 123.46 руб. Экспонента: 1.235e-01
Как вывести число с символом процента без умножения на 100?
4. Использование pprint.pformat для красивой печати словарей с большим количеством ключей
from pprint import pformat
data = {f"key_{i}": i**2 for i in range(10)}
formatted = pformat(data, width=60, sort_dicts=False)
print(formatted)
{'key_0': 0,
'key_1': 1,
'key_2': 4,
'key_3': 9,
'key_4': 16,
'key_5': 25,
'key_6': 36,
'key_7': 49,
'key_8': 64,
'key_9': 81}
5. Преобразование байтов с разными кодировками и обработка ошибок
raw = b'\xff\xfeH\x00e\x00l\x00l\x00o\x00'
try:
print(raw.decode('utf-8'))
except UnicodeDecodeError as e:
print(f"Ошибка: {e}")
print("Используем UTF-16:")
print(raw.decode('utf-16'))
print("Или заменяем неверные байты:")
print(raw.decode('utf-8', errors='replace'))
Ошибка: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte Используем UTF-16: Hello Или заменяем неверные байты: ��Hello
6. Кастомный __str__ для класса с __slots__
class Point:
__slots__ = ('x', 'y')
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Point({self.x}, {self.y})"
def __repr__(self):
return f"Point({self.x!r}, {self.y!r})"
p = Point(3, 4)
print(str(p))
print(repr(p))
Point(3, 4) Point(3, 4)
При использовании __slots__ нельзя передавать **kwargs в __init__ без явного перечисления. В примере это учтено.