Skip to content

Latest commit

 

History

History
40 lines (33 loc) · 1.5 KB

File metadata and controls

40 lines (33 loc) · 1.5 KB

Differences between PyPy and CPython

Note: this is an excerpt from the PyPy documentation. On Nov. 19, 2014 I ran this test on PyPy 2.4.0 and PyPy3 2.4.0 and the result was not as described, but was the same as with CPython: 'foo'.

Subclasses of built-in types

Officially, CPython has no rule at all for when exactly overridden method of subclasses of built-in types get implicitly called or not. As an approximation, these methods are never called by other built-in methods of the same object. For example, an overridden __getitem__() in a subclass of dict will not be called by e.g. the built-in get() method.

The above is true both in CPython and in PyPy. Differences can occur about whether a built-in function or method will call an overridden method of another object than self. In PyPy, they are generally always called, whereas not in CPython. For example, in PyPy, dict1.update(dict2) considers that dict2 is just a general mapping object, and will thus call overridden keys() and __getitem__() methods on it. So the following code prints 42 on PyPy but foo on CPython:

>>> class D(dict):
...     def __getitem__(self, key):
...         return 42
...
>>>
>>> d1 = {}
>>> d2 = D(a='foo')
>>> d1.update(d2)
>>> print(d1['a'])
42