Python Forum
which code is more readable? - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: which code is more readable? (/thread-902.html)



which code is more readable? - Skaperen - Nov-13-2016

i was recoding, today, a file of a project i am working on.  that file had some code like example number 0.  so i decided to recode it like example number 1.  note that if the () are omitted, it is a syntax error where the interpreter is treating it as an assignment of three values (with the middle value being a conditional choice) to two variables, which does not make any sense.

so which of the two examples do you consider to be more readable?

example #0

if remote_hash > local_hash:
    use_key = remote_key
    use_name = remote_name
else:
    use_key = local_key
    use_name = local_name
print( 'using', use_name )
example #1

use_key, use_name = (remote_key, remote_name) if remote_hash > local_hash else (local_key, local_name)
print( 'using', use_name )



RE: which code is more readable? - Yoriz - Nov-13-2016

The first one is better, it can be read in one glance.
The second one you have to scroll your eyes right along it to figure out what it is doing.


RE: which code is more readable? - JChris - Nov-13-2016

I also vote for example 0. From "The Zen of python": 

Quote:Readability counts.



RE: which code is more readable? - Ofnuts - Nov-13-2016

I would vote for using (key,name) tuples instead of separate variables, and then the first choice becomes as palatable as the second.

I'm surprised at the use of '>' on hashes, so either the operator is the wrong one, or your hashes aren't really hashes and your variable names are misleading :)


RE: which code is more readable? - ichabod801 - Nov-13-2016

Definitely #0. The structure is obvious, so you can just fit what you're reading into the structure. In #1 you have to figure out the structure and what's in the structure.


RE: which code is more readable? - Skaperen - Nov-14-2016

(Nov-13-2016, 05:16 PM)Ofnuts Wrote: I would vote for using (key,name) tuples instead of separate variables, and then the first choice becomes as palatable as the second.

I'm surprised at the use of '>' on hashes, so either the operator is the wrong one, or your hashes aren't really hashes and your variable names are misleading :)

so, you mean:


if remote_hash > local_hash:
    use_key, use_name = remote_key, remote_name
else:
    use_key, use_name = local_key, local_name
?

what this part of the code is doing is selecting whether remote or local is to be used "at random".  both hosts will be doing this and they need to be "in sync" by making the same choice.  they are symmetrical in the sense that neither has any predominant state or attribute over the other.  each has the other's key.  each knows the other as the remote, so in this sense they are making opposite choices.  the hash for a host is a hash of it's key and name.  both hosts thus can generate the same hashes which provide psuedo-random (weak, but good enough to not be systematically making the same choice too often) decision making.

...
remote_key = secure_key_transfer_from_peer_host()

remote_hash = hashlib.sha224( remote_name + remote_key ).hexdigest()
local_hash = hashlib.sha224( local_name + local_key ).hexdigest()
this hash exists only for making this common choice, so each host is using the same shared key, one or the other