LINUX.ORG.RU

[python] Почему один и тот же класс, импортированный из разных модулей, не равен сам себе?

 


0

1

Почему если есть два модуля, в которых импортируется класс из третьего по разному, то в первом модуле будет два разных класса? И как это исправить?
Пытался воспризвести это на простом примере, не получилось. Однако в реальном проекте именно такой баг.
Выводит
<class 'somepackage.somemodule.Someclass'>
<class 'somemodule.Someclass'>

хотя должен был бы только
<class 'somemodule.Someclass'

Ответ на: комментарий от anonymous

а как это исправить? если физически модули одни и теже, только называются по разному из разных модулей

nbdarvin
() автор топика

Что значит «одинаковые»? Если это один класс то ссылки на него будут равны друг другу, т.е. class1 == class2. Если они «равны» синтаксически то это уже нифига не один и тот же класс, это два разных класса.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

в твоём случае должно быть class1 == class2, проверь.

true_admin ★★★★★
()
Ответ на: комментарий от tailgunner

вот здесь перечисляю некоторые классы
http://github.com/darvin/cryotec-service/blob/master/cryotec_service/cryotec_...

(импортирую из разных мест и запихиваю классы в словарь)
потом импортирую этот словарь вот здесь:
http://github.com/darvin/cryotec-service/blob/master/cryotec_qtclient/models.py

каждый из классов - подкласc Model http://github.com/darvin/qtdjango/blob/master/src/qtdjango/models.py . У некоторых из них есть статический параметр ForeingKey, который инициализируется параметром - классом подклассом Model. Так вот, получается что тот те подклассы Model, которые я импортирую в cryotec_qtdjango_objects.py не равны тем подклассам Model, которые импортированны в модулях, которые импортируются из cryotec_qtdjango_objects.py для инициализации ForeingKey (хотя они в одном и том же месте)

nbdarvin
() автор топика
Ответ на: комментарий от nbdarvin

Ты сказал так много, но не ответил на единственный вопрос... и на постинг true_admin ты тоже не ответил.

tailgunner ★★★★★
()

Такое бывает когда в PYTHONPATH попадают одни и те же модули дважды. В твоём случае это $projectpath и $projectpath/somepackage

У меня такое было. Вылечил тем, что поменял порядок путей в PYTHONPATH. Но лучше такого избегать вовсе.

k_andy ★★★
()

Так устроен загрузчик модулей питона. С этим ничего делать не надо.

В данном случае вы неправильно импортируете модули. Используйте importlib и импортируйте через абсолютный путь с package.

В джанге, кстати, для загрузки моделей есть своя инфраструктура, см. django.db.models.loading.

ntp
()

а-ля неймспейсы. это не баг.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.