[pypy-commit] extradoc extradoc: This was also done
alex_gaynor
noreply at buildbot.pypy.org
Sat Nov 9 17:03:06 CET 2013
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: extradoc
Changeset: r5108:5acdadcc32fd
Date: 2013-11-09 08:02 -0800
http://bitbucket.org/pypy/extradoc/changeset/5acdadcc32fd/
Log: This was also done
diff --git a/planning/primitive-identity.rst b/planning/primitive-identity.rst
deleted file mode 100644
--- a/planning/primitive-identity.rst
+++ /dev/null
@@ -1,70 +0,0 @@
-Primitive objects and object identity
-=====================================
-
-Hi all,
-
-Recently PyPy merged a pretty big branch that allows for transparently
-type-specializing dictionaries. That means if you write something like::
-
- strs = {x: str(x) for x in xrange(100000)}
-
-The dictionary would be specialized for integer keys, obviating the need to
-allocate W_IntObjects (PyPy's equivalent to PyIntObject).
-
-This, however introduces interesting behavior surrounding object identity
-(*only* with respect to primitive objects, none of what is discussed affects
-either mutable, or user-defined objects), specifically the follow code no
-longer works::
-
- x = int(x)
- z = {x: None}
- assert next(iter(z)) is x
-
-This would similiarly fail if you replaced is with comparing the id()s. The
-question now is, is this behavior a violation of the Python language
-definition, or is it a legal, interpreter defined difference?
-
-There are several arguments in favor:
-
-1) It is easier to implement this way, and removes complexity in the
- interpreter implementation, and allows for better performance.
-
-2) For all of these objects, identity is trivial. That is to say identity could
- always be replacement by an equality test and no semantics would be violated.
- In that respect requiring that identity be maintained adds no value, the
- new object is completely indistinguishable
-
-3) A reliance on object identity leads to some rather strange behavior, a good
- example of this is a recent discussion about the identity shortcut in
- ``dict.__contains__`` and ``list.__contains__``, specifically in the case of
- ``nan``. At present if you have a ``dict`` with a ``nan`` key the only way
- to retreive that value is to use the exact same ``nan`` object, another one
- will not do because ``nan`` does not have reflexive identity. Even on
- CPython, passing around this object could easily lose it's identity, for
- example various functions in the ``math`` module return a ``nan`` given a
- ``nan`` argument, but they make no guarntee that they return the same
- instance, furthering a reliance on any such behavior is wrong, given that
- equality is always a valid substitute.
-
-And arguments against::
-
-1) It may break some existing code (so far the only such code I've found is in
- the Python test suite, it was not testing this behavior directly, but rather
- incidentally relied on it).
-
-
-I can find no other argument against it.
-
-Note that should we decide that this is in fact a violation of the language
-spec, the resulting behavior in PyPy will be for identity to be equality on
-primitive type objects. That is to say, the following code would work::
-
- assert all([
- x is (x + 1 - 1)
- for x in xrange(sys.minint, sys.maxint)
- ])
-
-As actually assigning allocating W_IntObjects will not occur.
-
-Opinions welcome,
-Alex
More information about the pypy-commit
mailing list