docs: def setdefault(self, key, val):
          """
          set a default value for key
  
          this is different than dict's setdefault because it will set default either
          if the key doesn't exist, or if the value at the key evaluates to False, so
          an empty string or a None value will also be updated
  
          :param key: string, the attribute to update
          :param val: mixed, the attributes new value if key has a current value
              that evaluates to False
          """
          if not getattr(self, key, None):
              setattr(self, key, val)