Строковое представление объектов Python: от str до JSON

Раздел: Python -> Строки

Основные способы преобразования объектов в строку

Как получить строковое представление любого объекта без специальных модулей?

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

При использовании сложных выражений внутри фигурных скобок f-строки нужно оборачивать их в круглые скобки, иначе возможна синтаксическая ошибка.

Как получить отладочное представление объекта с максимальной информацией?

Функция 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__ должен быть однозначным.
- Python последнее слово в строке (извлечение последнего слова из строки в python)
- индекс элемента строки python (получение индекса символа или подстроки в строке python)
- Python номера символов (номера (индексы) символов в строке python)

Расширенные примеры преобразования объектов в строку

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__ без явного перечисления. В примере это учтено.

Преобразование объекта в строку в Python - comments

En
Python объект в строку (python)