docs: def convert(dbus_obj):
      """Converts dbus_obj from dbus type to python type.
  
      :param dbus_obj: dbus object.
      :returns: dbus_obj in python type.
      """
      _isinstance = partial(isinstance, dbus_obj)
      ConvertType = namedtuple('ConvertType', 'pytype dbustypes')
  
      pyint = ConvertType(int, (dbus.Byte, dbus.Int16, dbus.Int32, dbus.Int64,
                                dbus.UInt16, dbus.UInt32, dbus.UInt64))
      pybool = ConvertType(bool, (dbus.Boolean, ))
      pyfloat = ConvertType(float, (dbus.Double, ))
      pylist = ConvertType(lambda _obj: list(map(convert, dbus_obj)),
                           (dbus.Array, ))
      pytuple = ConvertType(lambda _obj: tuple(map(convert, dbus_obj)),
                            (dbus.Struct, ))
      types_str = (dbus.ObjectPath, dbus.Signature, dbus.String)
      if not PY3:
          types_str += (dbus.UTF8String,)
      pystr = ConvertType(str if PY3 else unicode, types_str)
  
      pydict = ConvertType(
          lambda _obj: dict(zip(map(convert, dbus_obj.keys()),
                                map(convert, dbus_obj.values())
                                )
                            ),
          (dbus.Dictionary, )
      )
  
      for conv in (pyint, pybool, pyfloat, pylist, pytuple, pystr, pydict):
          if any(map(_isinstance, conv.dbustypes)):
              return conv.pytype(dbus_obj)
      else:
          return dbus_obj