code: def gsignal(name, *args, **kwargs):
      
  
      frame = sys._getframe(1)
      try:
          locals = frame.f_locals
      finally:
          del frame
  
      dict = locals.setdefault('__gsignals__', {})
  
      if args and args[0] == 'override':
          dict[name] = 'override'
      else:
          retval = kwargs.get('retval', None)
          if retval is None:
              default_flags = gobject.SIGNAL_RUN_FIRST
          else:
              default_flags = gobject.SIGNAL_RUN_LAST
  
          flags = kwargs.get('flags', default_flags)
          if retval is not None and flags != gobject.SIGNAL_RUN_LAST:
              raise TypeError(
                  "You cannot use a return value without setting flags to "
                  "gobject.SIGNAL_RUN_LAST")
  
          dict[name] = (flags, retval, args)
docs: Add a GObject signal to the current object.
  
      It current supports the following types:
          - str, int, float, long, object, enum
  
      :param name: name of the signal
      :param args: types for signal parameters,
          if the first one is a string 'override', the signal will be
          overridden and must therefor exists in the parent GObject.
  
      .. note:: flags: A combination of;
  
        - gobject.SIGNAL_RUN_FIRST
        - gobject.SIGNAL_RUN_LAST
        - gobject.SIGNAL_RUN_CLEANUP
        - gobject.SIGNAL_NO_RECURSE
        - gobject.SIGNAL_DETAILED
        - gobject.SIGNAL_ACTION
        - gobject.SIGNAL_NO_HOOKS