Search code examples
pythonmacrosboolean-logicabstraction

Named conditions in Python and a silly textbook - and how to prove they're wrong


Python's abstraction is often seen as magic by many. Coming from a C background, I know very well there is no such thing as magic, only cold hard code made up of simple components that produces abstraction.

So, when a textbook and my teacher say that we can "store conditions" or use "named conditions" for readability, and say that assigning a boolean expression to a variable suddenly makes it a dynamic condition akin to a macro, I lose it.


EDIT 1 : They don't explicitly say its like a macro (direct quotes are placed within quotes) since we aren't expected to know any other language beforehand.

The way they say that " the variable stores the condition unevaluated ", is like saying it is a macro , and this is my opinion. They imply it to be practically the equivalent of a macro by their articulation, just without saying the word 'macro'.


Here's the claim in code form :

x,y = 1,2
less = x < y 
more = x > y

'''
less/ more claimed to store not boolean True/False but some magical way of storing the
expression itself (unevaluated, say like a macro) and apparently 
'no value is being stored to less and more'. 
'''

It is being represented as though one was doing :

// C-style
#define less (x < y) 
#define more (x > y)

Of course, this is not true, because all less and more store in the so-called 'named conditions' is just the return value of the operator between x and y .

This is obvious since < , >, == , <= , >= all have boolean return values as per the formal man pages and the spec, and less or more are only storing the True or False boolean return value , which we may prove by calling print() on them and/or by calling type() on them.

Also, changing the values of x and y , say by doing x,y = y,x does not change the values of less or more because they store not a dynamic expression but the static return value of the > or < operand on the initial x and y values.

The question isn't that this claim is a misunderstanding of the purported abstraction ( its not actually an abstraction, similar storage can be achieved in asm or C too) , but rather how to clearly and efficiently articulate to my teacher that it is not working like a C macro but rather storing the boolean return value of >or < statically.


Solution

  • Obviously less = x < y just looks at the current values of x and y and stores either True or False into the variable less.

    If I understand where you and your teacher disagree, you two have a different idea of what the following code will print out:

    x, y = 1, 2
    less = x < y
    print(less)
    x, y = 2, 1
    print(less)