code: def fqn(o):
      
      parts = []
      if isinstance(o, (str, bytes)):
          return o
      if not hasattr(o, '__module__'):
          raise ValueError('Invalid argument `%s`' % o)
      parts.append(o.__module__)
      if isclass(o):
          parts.append(o.__name__)
      elif isinstance(o, types.FunctionType):
          parts.append(o.__name__)
      else:
          parts.append(o.__class__.__name__)
      return '.'.join(parts)
docs: Returns the fully qualified class name of an object or a class
  
      :param o: object or class
      :return: class name