text: #! python
  #
  # This module implements a special URL handler that allows selecting an
  # alternate implementation provided by some backends.
  #
  # This file is part of pySerial. https://github.com/pyserial/pyserial
  # (C) 2015 Chris Liechti <cliechti@gmx.net>
  #
  # SPDX-License-Identifier:    BSD-3-Clause
  #
  # URL format:    alt://port[?option[=value][&option[=value]]]
  # options:
  # - class=X used class named X instead of Serial
  #
  # example:
  #   use poll based implementation on Posix (Linux):
  #   python -m serial.tools.miniterm alt:///dev/ttyUSB0?class=PosixPollSerial
  
  import sys
  import time
  
  import serial
  
  try:
      import urlparse
  except ImportError:
      import urllib.parse as urlparse
  
  
  def serial_class_for_url(url):
      """extract host and port from an URL string"""
      parts = urlparse.urlsplit(url)
      if parts.scheme != 'alt':
          raise serial.SerialException('expected a string in the form "alt://port[?option[=value][&option[=value]]]": not starting with alt:// (%r)' % (parts.scheme,))
      class_name = 'Serial'
      try:
          for option, values in urlparse.parse_qs(parts.query, True).items():
              if option == 'class':
                  class_name = values[0]
              else:
                  raise ValueError('unknown option: %r' % (option,))
      except ValueError as e:
          raise serial.SerialException('expected a string in the form "alt://port[?option[=value][&option[=value]]]": %s' % e)
      return (''.join([parts.netloc, parts.path]), getattr(serial, class_name))
  
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  if __name__ == '__main__':
      s = serial_for_url('alt:///dev/ttyS0?class=PosixPollSerial')
      print(s)
  