class_docstr: A launch project specification.
class_docstr_tok: ["A","launch","project","specification","."]
docstr: Returns {PROJECT}_base:{PYTHON_VERSION}.
docstr_tok: ["Returns","{","PROJECT","}","_base",":","{","PYTHON_VERSION","}","."]
code: def base_image(self) -> str:
      """Returns {PROJECT}_base:{PYTHON_VERSION}."""
      # TODO: this should likely be source_project when we have it...
  
      # don't make up a separate base image name if user provides a docker image
      if self.docker_image is not None:
          return self.docker_image
  
      python_version = (self.python_version or "3").replace("+", "dev")
      generated_name = "{}_base:{}".format(
          self.target_project.replace(" ", "-"), python_version
      )
      return self._base_image or generated_name
  
imports: import enum
  import json
  import logging
  import os
  import tempfile
  from copy import deepcopy
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, cast
  import wandb
  import wandb.docker
  from wandb.apis.internal import Api
  from wandb.errors import CommError
  from wandb.sdk.launch import utils
  from wandb.sdk.lib.runid import generate_id
  from .errors import LaunchError
  from .utils import LOG_PREFIX, recursive_macro_sub
label_desc: Use image node_id 2 for calling the LaunchProject obj's underlying member method code with example usage: obj.base_image() and returns: unknown, self