• stebo02@sopuli.xyz
    link
    fedilink
    arrow-up
    24
    arrow-down
    1
    ·
    1 year ago

    Python:

    return a or b

    i like it because it reads like a sentence so it somewhat makes sense

    and you can make it more comprehensive if you want to:

    return a if a is not None else b

    • alehc@lemmy.world
      link
      fedilink
      arrow-up
      8
      arrow-down
      1
      ·
      1 year ago

      I personally dislike this because when you read “or” you expect some boolean result not a random object :/

      • gravitas_deficiency
        link
        fedilink
        English
        arrow-up
        1
        ·
        edit-2
        1 year ago

        In python: Not necessarily.

        If you have an arg whose default is something you’re not supposed to bind as a default value in the function sig (e.g. the result of a function call), make it an Optional, default it to None, and then on the first line just do some_arg = some_arg or interesting_function()

    • rwhitisissle@lemmy.ml
      link
      fedilink
      arrow-up
      2
      arrow-down
      1
      ·
      1 year ago

      For newer python people, they see return a or b and typically think it returns a boolean if either is True. Nope. Returns a if a is truthy and then checks if b is truthy. If neither are truthy, it returns b.

      • Arthur Besse@lemmy.ml
        link
        fedilink
        arrow-up
        7
        ·
        edit-2
        1 year ago

        Returns a if a is truthy and then checks if b is truthy. If neither are truthy, it returns b.

        Not quite. If a is not truthy, then the expression a or b will always return b.

        So, there is never any reason to check the truthiness of b.

        you can paste this in your repl to confirm it does not.
        class C:
         def __repr__(self): return [k for k, v in globals().items() if v is self][0]
         def __bool__(self):
          print(f"{self}.__bool__() was called")
          return False
        
        a, b = C(), C()
        print(f"result: {a or b}")
        
        output
        a.__bool__() was called
        result: b