Этот вопрос касается сравнения типов, а не объектов python. Точнее, почему тип, определенный в модуле __main__
, отличается от типа, импортированного модулем importlib.import_module()
. Обратите внимание, что проблема не возникает (test2()
), если все типы импортируются importlib.import_module()
.
Учитывая модуль с именем m.py:
class A(object):
pass
class B(A):
pass
def test1():
# pass
assert issubclass(B, A)
# prepare test with imported module
from importlib import import_module
m = import_module('m')
# pass
assert issubclass(m.B, m.A)
# fail
assert issubclass(m.B, A)
# fail
assert m.A is A
assert m.B is B
def test2():
from importlib import import_module
m0 = import_module('m')
m1 = import_module('m')
assert m0.A is m1.A
assert m0.B is m1.B
assert issubclass(m0.B, m1.A)
if __name__ == '__main__':
import sys
if len(sys.argv) == 2:
if sys.argv[1] == 'test1':
test1()
if sys.argv[1] == 'test2':
test2()
Почему python m.py test1 не работает, а python m.py test2 — нет? (проверено с py2.7.x и py3.4.x)
__main__.A
не тот же объект, что иm.A
; вы импортировали файл дважды, один раз как основной скрипт, второй раз как модуль. - person Martijn Pieters   schedule 02.07.2014m.B
подклассом__main__.A
. Это не. Это подкласс__main__.A
, другой объект. - person Martijn Pieters   schedule 02.07.2014test1
, он успешен. - person Martijn Pieters   schedule 02.07.2014issubclass(m0.B, m1.A)
m0.B и m1.A - разные объекты, но утверждение проходит. Почему? - person Carlo Pires   schedule 02.07.2014sys.modules['m']
создается только один раз и возвращается для последующего импорта. Таким образом,m0
иm1
являются ссылками на один и тот же объект модуля. - person Martijn Pieters   schedule 02.07.2014m0 is m1
естьTrue
, а вtest1
вы предполагаете, чтоsys.modules['__main__'] is m
верно, но это не так. - person Martijn Pieters   schedule 02.07.2014