2012-02-26 62 views
0

我创建了Django File对象的子类来照顾远程文件。 我也想通过创建一个RemoteFileLazy子类化Lazyobject类来创建一个懒惰版本,但它不能像我期望的那样工作。我收到一个错误。RuntimeError:超过最大递归深度:为什么?

import urllib2 
from django.core.files.base import File 
from django.utils.functional import LazyObject 

class RemoteFile(File): 

    def __init__(self, url): 
     super(RemoteFile, self).__init__(urllib2.urlopen(urllib2.Request(url))) 

    def __str__(self): 
     return 'Remote content' 

    def __nonzero__(self): 
     return True 

    def open(self, mode=None): 
     self.seek(0) 

    def close(self): 
     pass 

    def chunks(self, chunk_size=None): 
    # CHUNKS taking care of no known size! 
     if not chunk_size: 
      chunk_size = self.DEFAULT_CHUNK_SIZE 

     if hasattr(self, 'seek'): 
      self.seek(0) 
     # Assume the pointer is at zero... 
     counter = self.size 

     while True: 
      data = self.read(chunk_size) 
      if not data: 
       break 
      yield data 

class RemoteFileLazy(LazyObject): 

    def __init__(self, url): 
     # # as said in the django code: For some reason, we have to inline LazyObject.__init__ here to avoid 
     # recursion 
     self._wrapped = None 
     self.url = url 

    def _setup(self): 
     self._wrapped = RemoteFile(self.url) 

当我运行这段代码:

rfl = filehelper.RemoteFileLazy(url="http://www.google.fr") 

我得到这个错误:

RuntimeError: maximum recursion depth exceeded 

任何想法?我没有叫LazyObject。 init因为它在django代码中提到,虽然... 我认为init方法中的“self.url = url”会触发这个错误吗?所以我不能使用具有属性的懒惰对象?

谢谢。

回溯:

c:\Users\Michael\Dropbox\development\tools\Portable Python 2.7.2.1-django1.3.1\App\lib\site-packages\django\utils\functional.pyc in __getattr__(self, name) 
    274  def __getattr__(self, name): 
    275   if self._wrapped is None: 
--> 276    self._setup() 
    277   return getattr(self._wrapped, name) 
    278 

C:\Users\Michael\Dropbox\development\projects\django-socialdealing\socialdealing\apps\etl\utils\filehelper.py in _setup(self) 
    58 
    59  def _setup(self): 
---> 60   self._wrapped = RemoteFile(self.url) 
    61 
    62 

c:\Users\Michael\Dropbox\development\tools\Portable Python 2.7.2.1-django1.3.1\App\lib\site-packages\django\utils\functional.pyc in __getattr__(self, name) 
    274  def __getattr__(self, name): 
    275   if self._wrapped is None: 
--> 276    self._setup() 
    277   return getattr(self._wrapped, name) 
    278 
+1

你可以粘贴一部分追踪,以便我们可以看到什么函数被无限递归? – 2012-02-26 23:21:00

+0

当然,我补充一下。 – Michael 2012-02-26 23:33:07

回答

1

你不能在正常的方式LazyObject包装分配属性,它的意图被视为它是被包装的对象,所以试图通过访问,通过对包装对象,该对象尚未在您分配给url的位置创建。

为了解决这个问题,更换

self.url = url # this tries to retrieve the wrapped object to set its 'url' attribute 

self.__dict__['url'] = url # this actually stores an attribute on the LazyObject container. 

顺便说一句,当“借”的Django这样的内部,你会希望每一次升级Django的时间来测试真的硬。

相关问题