class_docstr: Data provider for managing experiment lifecycle.
class_docstr_tok: ["Data","provider","for","managing","experiment","lifecycle","."]
code: def can_write_experiment(self, key=None, user=None):
      assert key is not None
      user = user if user else self._get_userid()
  
      experiment = self._get(self._get_experiments_keybase() + key)
  
      if experiment:
          owner = experiment.get("owner")
          if owner is None or owner == "guest":
              return True
          return owner == user
      return True
  
imports: import time
  from concurrent.futures import ThreadPoolExecutor, wait
  from studio.util import util, logs
  from studio.storage.storage_handler import StorageHandler
  from studio.artifacts.artifact import Artifact
  from studio.experiments.experiment import Experiment, experiment_from_dict
  from studio.storage.storage_setup import get_storage_verbose_level
  from studio.util.util import retry, report_fatal, compression_to_extension, check_for_kb_interrupt
label_desc: Use image node_id 29 for calling the KeyValueProvider obj's underlying member method code with example usage: obj.can_write_experiment(key, user) and returns: True, unknown, True