text: from difflib import get_close_matches # for __getattr__
  
  class Demo(object):
      def __getattr__(self, name):
          """If a wrong method is called, this suggests methods with similar names."""
          toRemove = """__delattr__ __dict__ __getattribute__ __module__ __new__
                        __reduce__ __copy__ __reduce_ex__ __setattr__ __slot__
                        __weakref__ __str__ __class__ __doc__""".split()
          methods = set(dir(self.__class__)).difference(toRemove)
          suggestions = get_close_matches(name.lower(), methods, 5)
          raise_comment = "method '%s' not found.\n" % name
          raise_comment += "Most similar named ones: %s\n\n" % ", ".join(suggestions)
          first_lines = []
          for method in suggestions:
              doc = getattr(self.__class__, method).__doc__
              if doc:
                  first_lines.append(doc.splitlines()[0])
              else:
                  first_lines.append(method + " - no docstring found.")
          raise AttributeError, raise_comment + "\n".join(first_lines)
  
      # Some useless methods for this demo
      def addcube(self):
          """docstring of addcube()"""
      def addrube(self):
          """docstring of addrube()"""
      def adder(self):
          """docstring of adder()"""
      def waiter(self):
          """docstring of waiter()"""
      def boiler(self):
          """docstring of boiler()"""
  
  # Test of the __getattr__
  d = Demo()
  d.addCube()
  