В Python IDLE, в чем разница между «печатью» переменной и просто записью переменной? - PullRequest
2 голосов
/ 24 декабря 2011

В интерпретаторе IDLE я делаю следующее с dpkt:

for ts, buf in pcap:
  eth = dpkt.ethernet.Ethernet(buf)

Теперь, когда я пытаюсь увидеть содержимое 'eth', я могу либо напечатать его, либо просто написать имя переменной.

Когда я делаю:

print eth

Я получаю:

O&áÿE(r @,òÀ¨
DYP?Jò}PªpÉ

Однако, когда я просто пишу:

eth

Я получаю более ожидаемый результат:

Ethernet(src='<removed>', dst='<removed>', data=IP(src='<removed>', off=16384, dst='<removed>', sum=11506, len=40, p=6, ttl=128, id=29344, data=TCP(seq=2527752393, ack=218580057, win=16202, sum=62077, flags=16, dport=80, sport=51626)))

Итак, мой вопрос: в чем принципиальная разница между «печатью (переменной)» и просто записью имени переменной? Если я сделаю простое задание (т. Е. «X = 100»), я получу результат «100» для обоих «print x» и «x»

Ответы [ 2 ]

10 голосов
/ 24 декабря 2011

print(variable) равно print(str(variable))

, тогда как

variable равно print(repr(variable))

Я предполагаю, что __repr__ и __str__метод класса dpkt.ethernet.Ethernet производит эти совершенно разные результаты.

Обновление: Взглянув на , исходный код говорит мне, что я прав.

2 голосов
/ 24 декабря 2011

В питоне есть две функции для представления данных в виде строки: repr() и str().

Когда вы используете оператор print, функция str вызывается для любых аргументов, которые вы указали для оператора print (и новая строка добавляется в конец результата). Например, x = 100; print x вызовет str (x). К результату («100») будет добавлен символ новой строки, и он будет отправлен на стандартный вывод.

Когда вы выполняете что-то отличное от оператора print, интерпретатор печатает любое значение, полученное выражением, используя repr, если только значение не равно None, в этом случае ничего не печатается.

В большинстве случаев между ними есть только тонкие различия. Объекты, однако, часто определяют свои собственные неидентичные __str__ и __repr__ методы (которые определяют поведение встроенных функций str и repr для этого объекта). В вашем примере метод * 109 * объекта eth должен отличаться от метода __str__.

Я бы предположил, что метод __str__ возвращает двоичное строковое представление объекта для отправки по сети, но я не уверен.

...