[Python-Dev] Evil setattr hack

Guido van Rossum guido@python.org
Sat, 12 Apr 2003 09:43:52 -0400


Someone accidentally discovered a way to set attributes of built-in
types, even though the implementation tries to prevent this.  For
example, you cannot modify the str type to add a new method.  Let's
define the method first:

    >>> def reverse(self):
    ...     return self[::-1]
    ...
    >>>

Using direct attribute assignment doesn't work:

    >>> str.reverse = reverse
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: can't set attributes of built-in/extension type 'str'
    >>>

Using the dictionary doesn't work either:

    >>> str.__dict__['reverse'] = reverse
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: object does not support item assignment
    >>>

But here's a trick that *does* work:

    >>> object.__setattr__(str, 'reverse', reverse)
    >>>

Proof that it worked:

    >>> "hello".reverse()
    'olleh'
    >>> 

What to do about this?  I *really* don't want changes to built-in
types to become a standard "hack", because there are all sorts of
things that could go wrong.  (For one, built-in type objects are
static C variables, which are shared between multiple interpreter
contexts in the same process.)

--Guido van Rossum (home page: http://www.python.org/~guido/)