Search code examples
pythonboolean-logicif-statement

How do "and" and "or" work when combined in one statement?


For some reason this function confused me:

def protocol(port):
    return port == "443" and "https://" or "http://"

Can somebody explain the order of what's happening behind the scenes to make this work the way it does.

I understood it as this until I tried it:

Either A)

def protocol(port):
    if port == "443":
        if bool("https://"):
            return True
    elif bool("http://"):
        return True
    return False

Or B)

def protocol(port):
    if port == "443":
        return True + "https://"
    else:
        return True + "http://"

Is this some sort of special case in Python, or am I completely misunderstanding how statements work?


Solution

  • It's an old-ish idiom; inserting parentheses to show priority,

    (port == "443" and "https://") or "http://"
    

    x and y returns y if x is truish, x if x is falsish; a or b, vice versa, returns a if it's truish, otherwise b.

    So if port == "443" is true, this returns the RHS of the and, i.e., "https://". Otherwise, the and is false, so the or gets into play and returns `"http://", its RHS.

    In modern Python, a better way to do translate this old-ish idiom is:

    "https://" if port == "443" else "http://"