code: def __init__(self, source=None, exn=None):
      self.values = {}
      if source is not None:
          for line in line_iter(source):
              line = line.lstrip()
              if not line:
                  continue
              if line[0] != "#":
                  break
              line = line[1:].lstrip()
              kind = next(
                  (
                      k
                      for k in ("distutils:", "cython:")
                      if line.startswith(k)
                  ),
                  None,
              )
              if kind is not None:
                  key, _, value = [
                      s.strip()
                      for s in line[len(kind) :].partition("=")
                  ]
                  type = distutils_settings.get(key, None)
                  if line.startswith("cython:") and type is None:
                      continue
                  if type in (list, transitive_list):
                      value = parse_list(value)
                      if key == "define_macros":
                          value = [
                              tuple(macro.split("=", 1))
                              if "=" in macro
                              else (macro, None)
                              for macro in value
                          ]
                  if type is bool_or:
                      value = strtobool(value)
                  self.values[key] = value
      elif exn is not None:
          for key in distutils_settings:
              if key in ("name", "sources", "np_pythran"):
                  continue
              value = getattr(exn, key, None)
              if value:
                  self.values[key] = value
  
imports: from __future__ import absolute_import, print_function
  import cython
  from ..None import __version__
  import collections
  import contextlib
  import hashlib
  import os
  import shutil
  import subprocess
  import re, sys, time
  import warnings
  from glob import iglob
  from io import open
  from os.path import relpath
  from distutils.extension import Extension
  from distutils.util import strtobool
  import zipfile
  from ..None import Utils
  from ..Utils import cached_function, cached_method, path_exists, write_depfile, safe_makedirs, copy_file_to_dir_if_newer, is_package_dir, replace_suffix
  from ..Compiler.Main import Context, CompilationOptions, default_options
label_desc: Use image node_id 1 to create a new DistutilsInfo object from inherited base classes: object with example: obj = DistutilsInfo(source, exn)