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:
O&áÿE(r @,òÀ¨ DYP?Jò}PªpÉ
However, when I simply write:
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 to
variable equals to
My guess is that the
__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.
There are two functions for representing data as a string in python:
When you use a
str function is called on whatever arguments you supplied for the
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
__repr__ methods (which define the behavior for the
repr built-in functions for that object). In your example, the
__repr__ method must be different from the
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.