code: def parse_options(args=None, config=True, rootdir=CURDIR, **overrides):  # noqa
      
      args = args or []
  
      # Parse args from command string
      options = PARSER.parse_args(args)
      options.file_params = dict()
      options.linters_params = dict()
  
      # Compile options from ini
      if config:
          cfg = get_config(str(options.options), rootdir=rootdir)
          for opt, val in cfg.default.items():
              LOGGER.info('Find option %s (%s)', opt, val)
              passed_value = getattr(options, opt, _Default())
              if isinstance(passed_value, _Default):
                  if opt == 'paths':
                      val = val.split()
                  if opt == 'skip':
                      val = fix_pathname_sep(val)
                  setattr(options, opt, _Default(val))
  
          # Parse file related options
          for name, opts in cfg.sections.items():
  
              if name == cfg.default_section:
                  continue
  
              if name.startswith('pylama'):
                  name = name[7:]
  
              if name in LINTERS:
                  options.linters_params[name] = dict(opts)
                  continue
  
              mask = re.compile(fnmatch.translate(fix_pathname_sep(name)))
              options.file_params[mask] = dict(opts)
  
      # Override options
      _override_options(options, **overrides)
  
      # Postprocess options
      for name in options.__dict__:
          value = getattr(options, name)
          if isinstance(value, _Default):
              setattr(options, name, process_value(name, value.value))
  
      if options.concurrent and 'pylint' in options.linters:
          LOGGER.warning('Can\'t parse code asynchronously with pylint enabled.')
          options.concurrent = False
  
      return options
docs: Parse options from command line and configuration files.
  
      :return argparse.Namespace: