New submission from Johann Bernhardt <johann.bernha...@tum.de>:

Greetings,

tl;dr Depending on how a class is imported it will have a differenct class name 
and therefore prototype. I ran into this issue when i used a class variable to 
implement an event bus.

To reproduce you need a module and a submodule. The example creates two child 
classes that and collects their references for further use in a class/static 
variable in the parent. Depending on the import description this might be 
broken. Here, the code:

module
  |--main.py
  |--child.py
  |--submodule
       |-parent.py
       |-__init.py__

parent.py:
    class Parent:

        listeners = []

        def __init__(self):
            Parent.listeners.append(self)
            print("Parent: " + str(len(Parent.listeners)))

child.py
    from submodule.parent import Parent

    class Child(Parent):

        def __init__(self):
            super(Child, self).__init__()
            print("Child: " + str(Parent.listeners))

main.py
    from module.child import Child
    from module.submodule.parent import Parent

    class ChildLocal(Parent):

        def __init__(self):
            super(ChildLocal, self).__init__()
            print("ChildLocal: " + str(Parent.listeners))


if __name__ == '__main__':
    child= Child()
    local = ChildLocal()

Result:
    Parent: 1
    Child: [<module.submodule.Child object at 0x0000020F51EE2DC8>]
    Parent: 1
    ChildLocal: [<__main__.ChildLocal object at 0x0000020F51EE2E48>]
Here, the parent object is imported in two different ways and two separate 
parental classes are created. Hence, each parent class collects only one child

If Parent is importet in child.py as 'from module.submodule.parent import 
Parent" (difference is the module.) the result looks as follows:
    Parent: 1
    Child: [<module.submodule.Child object at 0x00000182B0982DC8>]
    Parent: 2
    ChildLocal: [<module.submodule.Child object at 0x00000182B0982DC8>, 
<__main__.ChildLocal object at 0x00000182B0982E48>]
Here, both children are registered in the same parent class as intenden

In conclusion, there is a nasty (to debug) difference between a relative import 
path and a project root path. I am quite certain this behaviour is as intenden, 
but on the little chance it isn't i wanted to bring this to attentions, since 
it is a nightmare to find. Is it intended?

Cheers,
Sin

----------
messages: 383856
nosy: SinTh0r4s
priority: normal
severity: normal
status: open
title: Class has two prototypes
type: enhancement
versions: Python 3.7

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

Reply via email to