python-mode addition: an elisp function for super-call insertion

Erwin S. Andreasen erwin at
Thu Aug 22 17:44:13 CEST 2002

Here's an elisp function (tested in xemacs 21 and emacs 21) that will
insert the proper call to super when used inside a method. For example
in code like this:

class Derived(Base):
  defun method(self, args):

whilst standing at "X", calling py-insert-super will insert:
    super(Derived, self).method(args)

(defconst py-method-start-re
    "^[ \t]*def[ \t]+\\([a-zA-Z_0-9]+\\)[ \t]*([ \t]*\\([a-zA-Z_0-9]+\\)[ \t]*,?[ \t]*\\([^:]+\\)"
  "Start of a def, matches name in #1, name of self in #2 and the rest in #3,
 up to but excluding :")

(defun py-insert-super ()
  "When used inside a def of a class, insert a call using super to the
super-method of this class, e.g. super(Classname, self).method(args)."
  (interactive "*")
  (let* ((class-name (save-excursion
		       (re-search-backward py-class-start-re) (match-string 1)))
	 (method-name (save-excursion
			;; Ensure that we won't search past the beginning of class
			(re-search-backward py-method-start-re
					    (match-end 1)) (match-string 1)))
	 (self-name (match-string 2))
	 (method-args (match-string 3)))
    ;; Clean up method-args for default values. This is not perfect;
    ;; it will not correctly catch x=[1,2,3] but will stop at the
    ;; first comma
    (while (string-match "[ \t]*=[ \t]*?[^,)]+" method-args)
      (setq method-args (replace-match "" t t method-args)))
    (insert-string (format "super(%s, %s).%s(%s"
			   class-name self-name method-name method-args))

Note that different names for "self" will be correctly handled but class or
defuns split over several lines using \ or  more complex default
arguments won't be handled. Default arguments are handled by removing
characters that follow = until a ) or : is met, thus they will fail on
e.g. l=[1,2,3].

<erwin at>                           Herlev, Denmark     
<URL:>                             <*>   

More information about the Python-list mailing list