code: def parse_list_or_docstring(options, sps):
      
      import py3status.docstrings as docstrings
  
      # HARDCODE: make include path to search for user modules
      home_path = os.path.expanduser("~")
      xdg_home_path = os.environ.get("XDG_CONFIG_HOME", "{}/.config".format(home_path))
      options.include_paths = [
          "{}/py3status/modules".format(xdg_home_path),
          "{}/i3status/py3status".format(xdg_home_path),
          "{}/i3/py3status".format(xdg_home_path),
          "{}/.i3/py3status".format(home_path),
      ]
      include_paths = []
      for path in options.include_paths:
          path = os.path.abspath(path)
          if os.path.isdir(path) and os.listdir(path):
              include_paths.append(path)
      options.include_paths = include_paths
  
      # init
      config = vars(options)
      modules = [x.rsplit(".py", 1)[0] for x in config["module"]]
  
      # list module names and details
      if config["command"] == "list":
          tests = [not config[x] for x in ["all", "user", "core"]]
          if all([not modules] + tests):
              msg = "missing positional or optional arguments"
              sps["list"].error(msg)
          docstrings.show_modules(config, modules)
  
      # docstring formatting and checking
      elif config["command"] == "docstring":
          if config["check"]:
              docstrings.check_docstrings(False, config, modules)
          elif config["diff"]:
              docstrings.check_docstrings(True, config, None)
          elif config["update"]:
              if not modules:
                  msg = "missing positional arguments or `modules`"
                  sps["docstring"].error(msg)
              if "modules" in modules:
                  docstrings.update_docstrings()
              else:
                  docstrings.update_readme_for_modules(modules)
          else:
              msg = "missing positional or optional arguments"
              sps["docstring"].error(msg)
docs: Handle py3-cmd list and docstring options.