Avatar ·

Какой аналог функции var_dump() в Python для отладки переменных?

Всем привет! Я только начинаю изучать Python после нескольких лет работы с PHP. В PHP я постоянно использовал функцию var_dump() для отладки — она показывает тип данных, значение и структуру переменной, включая массивы и объекты. Это очень удобно, когда нужно быстро понять, что хранится в переменной. Например, в PHP я пишу так: ```php 'Alice', 'age' => 30, 'hobbies' => ['reading', 'swimming']]; var_dump($data); ?> ``` И получаю наглядный вывод: ``` array(3) { ["name"]=> string(5) "Alice" ["age"]=> int(30) ["hobbies"]=> array(2) { [0]=> string(7) "reading" [1]=> string(8) "swimming" } } ``` В Python я пробовал использовать print(), но он просто выводит значение без типа данных и структуры. Пытался найти что-то похожее, но пока не разобрался. Пробовал pprint, но он не показывает типы. Подскажите, пожалуйста, есть ли в Python встроенная функция, которая делает то же самое, что и var_dump() в PHP? Или нужно использовать какие-то сторонние библиотеки? Буду благодарен за примеры кода! Спасибо! <<>>

Основной аналог: функция print() с repr() или pprint

Прямого аналога var_dump() в Python нет, но есть несколько способов получить похожий результат. Самый простой — использовать встроенную функцию print() вместе с repr(). Однако для полноценной отладки лучше применять модуль pprint (pretty print) и специальную функцию pdb.pp().

1. Базовый вариант: print() + repr()

Функция repr() возвращает строковое представление объекта, которое показывает его тип и структуру:

data = {'name': 'Alice', 'age': 30, 'hobbies': ['reading', 'swimming']}
print(repr(data))
# Вывод: {'name': 'Alice', 'age': 30, 'hobbies': ['reading', 'swimming']}

Это не так подробно, как var_dump(), но уже показывает структуру. Для вложенных данных сложно читать.

2. Лучший вариант: модуль pprint

Модуль pprint форматирует вывод с отступами, что делает его похожим на var_dump():

from pprint import pprint

data = {'name': 'Alice', 'age': 30, 'hobbies': ['reading', 'swimming']}
pprint(data)
# Вывод:
# {'age': 30,
#  'hobbies': ['reading', 'swimming'],
#  'name': 'Alice'}

Плюс: автоматически сортирует ключи словарей (как var_dump) и форматирует вложенные структуры.

3. Продвинутый вариант: модуль pdb (отладчик)

Если нужно увидеть типы данных (как var_dump), используйте pdb.pp() (Python 3.10+):

import pdb

data = {'name': 'Alice', 'age': 30, 'hobbies': ['reading', 'swimming']}
pdb.pp(data)
# Вывод:
# {'name': 'Alice' (str), 'age': 30 (int), 'hobbies': ['reading', 'swimming'] (list)}

Это наиболее близко к var_dump(), так как показывает типы элементов.

4. Для объектов и классов: vars() и dir()

Если нужно отладить объект, используйте vars() для атрибутов или dir() для всех методов:

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

user = User('Bob', 25)
print(vars(user))
# Вывод: {'name': 'Bob', 'age': 25}

5. Сторонняя библиотека: rich

Для максимально наглядного вывода с цветами и типами установите библиотеку rich:

pip install rich
from rich import print as rprint

data = {'name': 'Alice', 'age': 30, 'hobbies': ['reading', 'swimming']}
rprint(data)
# Вывод с подсветкой синтаксиса и типами

Сравнение с var_dump()

  • var_dump() — показывает тип, длину, значение и структуру.
  • pprint — показывает структуру, но без типов.
  • pdb.pp() — показывает типы, но без длины строк/массивов.
  • rich — самый наглядный, но требует установки.

Для повседневной отладки рекомендую pprint (встроенный) или pdb.pp() (если нужны типы).

<<>>

Альтернативный подход: кастомная функция var_dump()

Если вам не хватает встроенных средств, можно написать свою функцию, которая эмулирует поведение var_dump(). Вот простой пример:

def var_dump(variable, indent=0):
    if isinstance(variable, dict):
        print(' ' * indent + 'dict (' + str(len(variable)) + ')')
        for key, value in variable.items():
            print(' ' * (indent + 2) + f'["{key}"]=>')
            var_dump(value, indent + 4)
    elif isinstance(variable, list):
        print(' ' * indent + 'list (' + str(len(variable)) + ')')
        for i, value in enumerate(variable):
            print(' ' * (indent + 2) + f'[{i}]=>')
            var_dump(value, indent + 4)
    elif isinstance(variable, str):
        print(' ' * indent + f'string({len(variable)}) "{variable}"')
    elif isinstance(variable, int):
        print(' ' * indent + f'int({variable})')
    elif isinstance(variable, float):
        print(' ' * indent + f'float({variable})')
    elif variable is None:
        print(' ' * indent + 'NULL')
    else:
        print(' ' * indent + f'object({type(variable).__name__})')

# Пример использования
data = {'name': 'Alice', 'age': 30, 'hobbies': ['reading', 'swimming']}
var_dump(data)

Этот код выведет:

dict (3)
  ["name"]=>
    string(5) "Alice"
  ["age"]=>
    int(30)
  ["hobbies"]=>
    list (2)
      [0]=>
        string(7) "reading"
      [1]=>
        string(8) "swimming"

Такой подход даёт полный контроль над форматированием. Вы можете добавить поддержку объектов, булевых значений и других типов по мере необходимости.