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"
print(variable)
equals toprint(str(variable))
whereas
variable
equals toprint(repr(variable))
My guess is that the
__repr__
and__str__
method of the classdpkt.ethernet.Ethernet
produce these completely different results.Update: Having a look at the source code tells me I am right.
There are two functions for representing data as a string in python:
repr()
andstr()
.When you use a
print
statement, thestr
function is called on whatever arguments you supplied for theprint
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 isNone
, 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 thestr
andrepr
built-in functions for that object). In your example, theeth
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.