class_docstr: Describe the environment inside which the job is running.
  This includes job id, number of GPUs available, ...
  
  This class can only be instantiated from a running submitit job.
  
  @plugin-dev: default implementation look for information into environment variables.
  Override _env to map environment variable to each property.
code: def __repr__(self) -> str:
      # should look like this:
      # JobEnvironment(job_id=17015819, hostname=learnfair0218, local_rank=2(3), node=1(2), global_rank=5(6))
      info = [f"{n}={getattr(self, n)}" for n in ("job_id", "hostname")]
      names = ("local_rank", "node", "global_rank")
      totals = [
          self.num_tasks // self.num_nodes,
          self.num_nodes,
          self.num_tasks,
      ]
      info += [
          f"{n}={getattr(self, n)}({t})" for n, t in zip(names, totals)
      ]
      info_str = ", ".join(info)
      return f"JobEnvironment({info_str})"
  
imports: import os
  import signal
  import socket
  import sys
  import time
  import types
  import typing
  from pathlib import Path
  from .None import logger, utils
  from .utils import DelayedSubmission, JobPaths
label_desc: Use image node_id 17 for calling the JobEnvironment obj's underlying member method code with example usage: obj.__repr__() and returns: str, info_str, str