Ошибка эквивалентности isinstance () и type () из-за механизма импорта (python / django) - PullRequest
3 голосов
/ 25 января 2012

В проекте Django, над которым я работаю, я импортирую форму в следующем виде

#views.py
from forms import SomeForm

, затем в тестовом файле у меня есть

#form_test.py
from app.forms import SomeForm    
.
.
.
self.assertTrue(isinstance(response.context['form'], SomeForm))

Почему нетработа isinstance?

Если я проверяю вывод type () для двух объектов, я получаю это:

Форма response.context: Ожидаемая форма:

Я могу исправитьэто благодаря тому, что мой механизм импорта в views.py совпадает с механизмом в form_test.py, но это выглядит как неправильный подход.

для справки, структура файла выглядит следующим образом:

  • site/
    • manage.py
    • app /
      • forms.py
      • views.py
      • tests /
        • form_test.py

Ответы [ 2 ]

7 голосов
/ 25 января 2012

isinstance также сравните расположение модуля, response.context['form'] модуль класса 'равен forms, где модуль SomeForm равен app.forms, чтобы проверить это, проверив соответственно __class__.__module__ и __module__.

Чтобы заставить работать экземпляр, вы можете:

  • исправить импорт в views.py (рекомендуется)
  • Измените sys.path в form_testse.py, чтобы иметь возможность импортировать форму как из форм импорта SomeForm
  • попробуй внутрипакетные ссылки
0 голосов
/ 20 августа 2015

Одним из возможных способов взлома является проверка атрибута __name__ типов, хотя, если вы не исправите это Правильно, вы можете столкнуться с другими проблемами

def sharetypename(obj1, obj2):
    if isinstance(obj1, type):
        c1 = obj1.__name__
    else:
        c1 = type(obj1).__name__

    if isinstance(obj2, type):
        c2 = obj2.__name__
    else:
        c2 = type(obj2).__name__

    return c1 == c2
...