0

リモートファイルを処理するために、DjangoFileオブジェクトのサブクラスを作成しました。また、Lazyobjectクラスをサブクラス化するRemoteFileLazyを作成してレイジーバージョンを作成したかったのですが、期待どおりに機能しません。エラーが発生します。

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を呼び出しませんでした。djangoコードで言及されているようにinit ... 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
4

1 に答える 1

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をアップグレードするたびに非常にハードにテストする必要があります。

于 2012-02-27T10:49:22.137 に答える