Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Python IDLE, what's the difference between 'print'ing a variable and just writing the variable?

At the IDLE interpreter I do the following with dpkt:

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

Now, when I try to see the contents of 'eth' I can either print it, or just write the variable name.

When I do:

print eth

I get:

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

However, when I simply write:

eth

I get the more expected output of:

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

So my question is, what's the fundamental difference between doing a "print (variable)" and just writing the variable name? If I do a simple assignment (ie. "x = 100") I'll get a result of "100" for both "print x" and "x"

like image 453
Rauffle Avatar asked Oct 24 '25 14:10

Rauffle


2 Answers

print(variable) equals to print(str(variable))

whereas

variable equals to print(repr(variable))

My guess is that the __repr__ and __str__ method of the class dpkt.ethernet.Ethernet produce these completely different results.

Update: Having a look at the source code tells me I am right.

like image 123
gecco Avatar answered Oct 27 '25 04:10

gecco


There are two functions for representing data as a string in python: repr() and str().

When you use a print statement, the str function is called on whatever arguments you supplied for the print statement (and a newline is appended to the end of the result). For example, x = 100; print x will call str(x). The result ("100") will have a newline appended to it, and it will be sent to stdout.

When you execute something other than a print statement, the interpreter will print whatever value the expression yields using repr, unless the value is None, in which case nothing is printed.

In most cases, there are only subtle differences between the two. Objects, however, often define their own non-identical __str__ and __repr__ methods (which define the behavior for the str and repr built-in functions for that object). In your example, the eth object's __repr__ method must be different from the __str__ method.

I would speculate that the __str__ method is returning a binary string representation of the object to send across a network, but I can't be sure.

like image 38
HardlyKnowEm Avatar answered Oct 27 '25 03:10

HardlyKnowEm