New submission from ppperry <maprea...@olum.org>:

Take the following code:

    import builtins
    class K(dict):
        def __getitem__(self, k):
                if k not in builtins.__dict__:
                        print("get %s" % k)
                return dict.__getitem__(self, k)
        def __setitem__(self, k, v):
                print("set %s" % k)
                dict.__setitem__(self, k, v)
    exec("""
        foo = "bar"
        foo
        try:
            qyz
        except NameError:
            pass
        class K:
            baz = foo
            def f(ggg=foo): pass
        def g(ggg=foo):
            global f
            f = 87
            f
        g()
    """,K())

This should consitently either call or not call the overridden methods on the 
dictionary, producing either no output or:

    set foo
    get foo
    get qyz
    get foo
    get foo
    set K
    get foo
    set g
    get g
    set f
    get f
    
Instead, only sometime the override gets called, producing

    set foo
    get foo
    get qyz
    set K
    get foo
    set g
    get g
    get f

meaning that 
    (a) modifications of global variables via global statements
    (b) code at class-level

ignore overridden methods, whereas everything else follows them

----------
components: Interpreter Core
messages: 310388
nosy: ppperry
priority: normal
severity: normal
status: open
title: Inconsistent behavior if globals is a dict subclass
versions: Python 3.6

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

Reply via email to