Python Forum

Full Version: which code is more readable?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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 )
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.
I also vote for example 0. From "The Zen of python": 

Quote:Readability counts.
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 :)
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.
(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