update from Atlas with major reorg
This commit is contained in:
45
attic/interfaces/dict_subclass.py
Normal file
45
attic/interfaces/dict_subclass.py
Normal file
@@ -0,0 +1,45 @@
|
||||
# Code and text by BitBucket user "enigmacurry" posted to
|
||||
# https://bitbucket.org/pypy/pypy/issue/708/discrepancy-in-dict-subclass-__getitem__
|
||||
# Adapted by Luciano Ramalho:
|
||||
# - changed comments to docstring to run with doctest;
|
||||
# - added test for Test class raising exception
|
||||
# - and added () to print.
|
||||
|
||||
"""
|
||||
This is a test case to describe a bug I'm seeing in PyPy 1.5. I have
|
||||
a Cache object that is a dictionary that supports lookup via regular
|
||||
attribute access. For instance:
|
||||
|
||||
>>> c = Cache()
|
||||
>>> c["asdf"] = "asdf"
|
||||
>>> c.asdf == c["asdf"]
|
||||
True
|
||||
>>> t = Test()
|
||||
>>> t["asdf"] = "asdf"
|
||||
>>> t.asdf == t["asdf"]
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
Exception: Trying to getitem: asdf
|
||||
|
||||
When looking up keys via attribute, PyPy 1.5 calls __getitem__
|
||||
whereas CPython 2.7.1 does not.
|
||||
"""
|
||||
|
||||
class Cache(dict):
|
||||
"A dictionary that supports attribute style key lookup"
|
||||
def __init__(self, **kw):
|
||||
dict.__init__(self, kw)
|
||||
self.__dict__ = self
|
||||
|
||||
class Test(Cache):
|
||||
def __getitem__(self, item):
|
||||
# I want to process items differently than attributes:
|
||||
raise Exception("Trying to getitem: %s" % item)
|
||||
|
||||
if __name__ == "__main__":
|
||||
t = Test()
|
||||
t["asdf"] = "asdf"
|
||||
#CPython does not call __getitem__ .. PyPy does:
|
||||
print(t.asdf)
|
||||
#Doesn't matter if it's a member of __dict__ or not:
|
||||
print(t.__getattribute__)
|
||||
Reference in New Issue
Block a user