2012-02-22 53 views
2

我正在研究a patch for django-localeurl,我遇到了困惑我的问题。为了测试我的补丁添加的功能,我添加了触发这个错误,当我运行它们的Django主干(与旧版本没有问题)测试:未绑定的方法__init __()必须使用LocaleRegexProvider实例作为第一个参数调用(取而代之的是RegexURLPattern实例)

Traceback (most recent call last): 
    File "/home/al/dev/projects/django-localeurl/localeurl/tests/tests.py", line 498, in test_change_locale_check_session_disabled 
    self.client.post('/change/', data={'locale': 'de', 'next': '/foo'}) 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/test/client.py", line 449, in post 
    response = super(Client, self).post(path, data=data, content_type=content_type, **extra) 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/test/client.py", line 262, in post 
    return self.request(**r) 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/test/client.py", line 381, in request 
    response = self.handler(environ) 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/test/client.py", line 84, in __call__ 
    response = self.get_response(request) 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/core/handlers/base.py", line 179, in get_response 
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info()) 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/core/handlers/base.py", line 224, in handle_uncaught_exception 
    if resolver.urlconf_module is None: 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/core/urlresolvers.py", line 323, in urlconf_module 
    self._urlconf_module = import_module(self.urlconf_name) 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
    File "/home/al/dev/projects/django-localeurl/localeurl/urls.py", line 5, in <module> 
    url(r'^change/', change_locale, name='localeurl_change_locale'), 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/conf/urls/__init__.py", line 60, in url 
    return RegexURLPattern(regex, view, kwargs, name) 
    File "/home/al/dev/projects/django-localeurl/.tox/py26-trunk/lib/python2.6/site-packages/django/core/urlresolvers.py", line 172, in __init__ 
    LocaleRegexProvider.__init__(self, regex) 
TypeError: unbound method __init__() must be called with LocaleRegexProvider instance as first argument (got RegexURLPattern instance instead) 

但是当我读到the code that triggers this exception,我不能看看如何发生。为了了解情况,我加入了线以上这些打印语句其中基础__init__被称为:

print 
print "self.__class__:", self.__class__ 
print "self.__class__.__bases__:", self.__class__.__bases__ 
print "isinstance(self, LocaleRegexProvider):", isinstance(self, LocaleRegexProvider) 
print 
LocaleRegexProvider.__init__(self, regex) 

在某些情况下,这给了我预期的输出:

self.__class__: <class 'django.core.urlresolvers.RegexURLPattern'> 
self.__class__.__bases__: (<class 'django.core.urlresolvers.LocaleRegexProvider'>,) 
isinstance(self, LocaleRegexProvider): True 

但在某些情况下,给我这个奇怪的结果:

起初我以为的Django的其他部分可能是动态变化的基类的实例(此处称为self),致电LocaleRegexProvider.__init__时会引发异常。我的假设似乎被isinstance的结果证实,但打印出__bases__与此相矛盾。我认为如果LocaleRegexProvider在基类列表中,isinstance应该总是返回True。我在这里错过了什么?

回答

4

问题在于reload()函数,您可以在测试中使用它来重新加载url设置。根据文档:

与Python中的所有其他对象的旧 对象的引用计数后只回收降为零。 模块名称空间中的名称将更新为指向任何新的或已更改的对象。对旧对象的其他引用(例如模块外部的名称 )不会反弹以引用新对象 ,并且必须在每个命名空间中更新它们出现的位置,如果该位置是 所需的。

因此,您要重新加载urlresolvers模块,但这不是免费的副作用。来自旧urlresolvers的物品不会被reload销毁。在某些时候,你在内存中有两个RegexURLPattern类的副本。这些是不同的类(类对象),在代码中具有完全相同的名称和位置。当新的RegexURLPattern类的对象不是旧的RegexURLPattern对象的实例,并且它的基类构造函数不能被调用时,会导致错误。

相关问题