docs: def set(self, key, value, timeout=NotSet):
          """
          Set the given key to the given value in the cache.
          A timeout may be provided, otherwise, the :py:attr:`Cache.default_timeout`
          will be used.
  
          :param key: the key to which the value will be bound
          :type key: str
          :param value: the value to store in the cache
          :param timeout: the expiration delay for the value. None means it will never expire.
          :type timeout: integer or None
  
          Example usage:
  
          .. code-block:: python
  
              # this cached value will expire after half an hour
              cache.set('my_key', 'value', 1800)
          """
          if not self.enabled:
              return
  
          if hasattr(value, '__call__'):
              value = value()
          if timeout == NotSet:
              timeout = self.default_timeout
          self._set(key, value, timeout)
          return value