• sugar_in_your_tea@sh.itjust.works
      link
      fedilink
      arrow-up
      0
      ·
      6 days ago

      Why? not x means x is None or len(x) == 0 for lists. len(x) == 0 will raise an exception if x is None. In most cases, the distinction between None and [] isn’t important, and if it is, I’d expect separate checks for those (again, for explicitness) since you’d presumably handle each case differently.

      In short:

      • if the distinction between None and [] is important, have separate checks
      • if not, not x should be your default, since that way it’s a common pattern for all types
            • sugar_in_your_tea@sh.itjust.works
              link
              fedilink
              arrow-up
              0
              ·
              edit-2
              5 days ago

              def some_func(*args, kwarg=[])

              Don’t do this:

              def fun(l=[]):
                  l.append(len(l))
                  return l
              
              fun()  # [0]
              fun()  # [0, 1]
              fun(l=[])  # [0]
              fun()  # [0, 1, 2]
              fun(l=None)  # raise AttributeError or TypeError if len(l) comes first
              

              This can be downright cryptic if you’re passing things dynamically, such as:

              def caller(*args, **kwargs):
                  fun(*args, **kwargs)
              

              It’s much safer to do a simple check at the beginning:

              if not l: 
                  l = [] 
              
    • ExtremeDullard@lemmy.sdf.org
      link
      fedilink
      arrow-up
      0
      ·
      edit-2
      6 days ago

      In complex cases where speed is less important than maintainability, I tend to agree.

      In this case, a simple comment would suffice. And in fact nothing at all would be okay for any half-competent Python coder, as testing if lists are empty with if not is super-standard.