tweepy の Cursor を使うと AttributeError で切腹なさる
Traceback (most recent call last): File "foo.py", line 48, intest() File "foo.py", line 33, in test for status in tweepy.Cursor(api.user_timeline).items(50) : File "tweepy\cursor.py", line 181, in next self.current_page = self.page_iterator.next() File "tweepy\cursor.py", line 101, in next old_parser = self.method.__self__.parser AttributeError: 'function' object has no attribute '__self__'
AttributeError: 'function' object has no attribute '__self__' ってなんだよお前ぇええ!! 何で見つからないんよぉぉぉ!!! ('A`)
tweepy version 2.3 / python 2.6.6 です
解決方法
- tweepy に含まれる "binder.py" を開きます
- ファイル最後の return の前を、下にあるソースのようにちょぃと編集します。
- DogDay の Blu-ray を Amazon で発注します
- Enjoy!!
# Set pagination mode if 'cursor' in APIMethod.allowed_param: _call.pagination_mode = 'cursor' elif 'max_id' in APIMethod.allowed_param and \ 'since_id' in APIMethod.allowed_param: _call.pagination_mode = 'id' elif 'page' in APIMethod.allowed_param: _call.pagination_mode = 'page' _call.__self__ = config['api'] # **** !! append !! **** # return _call
原因
"function" なオブジェクトに "__self__" な属性が居ない事が原因です。 まんまじゃねか! トン!
……すいません(ぉ
落ちてるところの "self.method.__self__.parser"
の self.method
は、APIクラス内のメソッドが代入されます。 user_timeline
とか search
とか。 で、この関数オブジェクトに __self__ が無いわけですが、api.user_timeline
とかやりゃ、'api'というインスタンス付で関数オブジェクト取れるんちゃうのー? …と思ってしまう所ですが、このメソッドは実のところプロパティで return bind_api(...)
を返してる。 build_api()
は、builder.py の def _call(*args, **kwargs)
の関数オブジェクトを返してる。 _call()
関数内関数なので self なんて持つわけがない。 俺の関数がこんなに self を持たないわけがない!
→ return するまでに call の __self__ プロパティを作成、'api' のインスタンス設定してあげました。
おわり
python通な人ではないので、正しく解決方法かは分からぬですが*1、まぁ俺ローカルでは動いたから、まぁいいかなって…(ぉ
*1:特に __self__ を自前で代入とか良いんだろうか…