update from Atlas with major reorg
This commit is contained in:
40
attic/interfaces/pypy_difference.rst
Normal file
40
attic/interfaces/pypy_difference.rst
Normal file
@@ -0,0 +1,40 @@
|
||||
|
||||
====================================
|
||||
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'.
|
||||
|
||||
.. _PyPy: http://pypy.readthedocs.org/en/latest/cpython_differences.html#subclasses-of-built-in-types
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user