tweepy の Cursor を使うと AttributeError で切腹なさる

Traceback (most recent call last):
  File "foo.py", line 48, in 
    test()
  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 です

解決方法

  1. tweepy に含まれる "binder.py" を開きます
  2. ファイル最後の return の前を、下にあるソースのようにちょぃと編集します。
  3. DogDay の Blu-ray を Amazon で発注します
  4. 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.pydef _call(*args, **kwargs) の関数オブジェクトを返してる。 _call() 関数内関数なので self なんて持つわけがない。 俺の関数がこんなに self を持たないわけがない!

→ return するまでに call の __self__ プロパティを作成、'api' のインスタンス設定してあげました。



おわり


python通な人ではないので、正しく解決方法かは分からぬですが*1、まぁ俺ローカルでは動いたから、まぁいいかなって…(ぉ

おまけ

DogDays' (ダッシュ) ってのもあるよ!

DOG DAYS´ 1(完全生産限定版) [Blu-ray]
アニプレックス (2012-09-26)
売り上げランキング: 42,736

*1:特に __self__ を自前で代入とか良いんだろうか…