New submission from David Beazley:

Suppose you subclass a dictionary:

class mdict(dict):
    def __getitem__(self, index):
        print('Getting:', index)
        return super().__getitem__(index)

Now, suppose you define a function and perform these steps that reassign the 
function's attribute dictionary:

>>> def foo():
...     pass
... 
>>> foo.__dict__ = mdict()
>>> foo.x = 23
>>> foo.x          # Observe: No output from overridden __getitem__
23
>>> type(foo.__dict__)
<class '__main__.mdict'>
>>> foo.__dict__
{'x': 23}
>>> 

Carefully observe that access to foo.x does not invoke the overridden 
__getitem__() method in mdict.  Instead, it just directly accesses the default 
__getitem__() on dict. 

Admittedly, this is a really obscure corner case.  However, if the __dict__ 
attribute of a function can be legally reassigned, it might be nice for 
inheritance to work ;-).

----------
components: Interpreter Core
messages: 179364
nosy: dabeaz
priority: normal
severity: normal
status: open
title: Function attribute access doesn't invoke methods in dict subclasses
type: behavior
versions: Python 3.3

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue16894>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to