質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

解決済

3回答

22593閲覧

Python初心者です。 TypeError: get() takes 2 positional arguments but 3 were givenで困ってます。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

0クリップ

投稿2019/02/20 02:34

編集2019/02/20 09:27

はじめまして。
Python3.6でtwitterのユーザーストリームを取得するコードを書いていますが、
納得のいかないエラーが出て困っています。
下記ソースコードです。

python

1from requests_oauthlib import OAuth1Session 2 3USER_TL = "https://api.twitter.com/1.1/statuses/user_timeline.json" 4API_KEY = "*" 5API_SECRET_KEY = "*" 6ACCESS_TOKEN = "*" 7ACCESS_TOKEN_SECRET = "*" 8 9class Twitterclass: 10 def __init__(self,key,secret_key,token,secret_token): 11 self.twitter = OAuth1Session(key, secret_key, token, secret_token) 12 self.param = { 13 "screen_name": "apple", 14 "count": 200, 15 "include_entities": True, 16 "exclude_replies": False, 17 "include_rts": False, 18 } 19 20 def get_user_timeline(self): 21 self.twitter.get(USER_TL,self.param) 22# Twitterclass END 23 24twitter = Twitterclass(API_KEY, 25 API_SECRET_KEY, 26 ACCESS_TOKEN, 27 ACCESS_TOKEN_SECRET) 28twitter.get_user_timeline()

下記エラーメッセージです。

error

1TypeError: get() takes 2 positional arguments but 3 were given

エラー箇所は、下記コード部分です。

Python

1 self.twitter.get(USER_TL,self.param)

他サイト様で調べたところ、
Class内メソッドでClass内変数を呼び出す際、暗黙的にSelfが引数が呼ばれている、
との記載がありましたがいまいち理解が及ばずにいます。

下記コードのように、selfが暗黙的に引数として呼ばれていることは理解しています。

Python

1 self.twitter.get(self,USER_TL,self.param)

何故エラーが発生しているか、正しい書き方はどのような書き方か、
ご教授頂ければ幸いです。

また、Classの使い方が間違っている等ありましたら、
そちらもご指摘頂ければ幸いです。

長々と失礼致しました。

追記:
can110様
ご返信、ご回答頂きました方々、ありがとうございました。
ご回答、ご指摘頂きましたとおり、変更したコードを下記に示します。

python

1from requests_oauthlib import OAuth1Session 2 3USER_TL = "https://api.twitter.com/1.1/statuses/user_timeline.json" 4API_KEY = "*" 5API_SECRET_KEY = "*" 6ACCESS_TOKEN = "*" 7ACCESS_TOKEN_SECRET = "*" 8 9class Twitterclass: 10 def __init__(self,key,secret_key,token,secret_token): 11 self.twitter = OAuth1Session(key, secret_key, token, secret_token) 12 self.param = { 13 "screen_name": "apple", 14 "count": 200, 15 "include_entities": True, 16 "exclude_replies": False, 17 "include_rts": False, 18 } 19 20 def get_user_timeline(self): 21 return self.twitter.get(url = USER_TL,params = self.param) 22# Twitterclass END 23 24twitter = Twitterclass(API_KEY, 25 API_SECRET_KEY, 26 ACCESS_TOKEN, 27 ACCESS_TOKEN_SECRET) 28user_timeline = twitter.get_user_timeline()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/02/20 02:44

OAuth1Session がどこから来ているか(おそらくimportでしょうけど)、ソースに書いてあるとよいかと思いました。
t_obara

2019/02/20 03:15

OAuth1Sessionのgetメソッドのマニュアルをご覧になり、どのような定義になっているかを確認した上で、ご提示のような記述を行なったのでしょうか?その場合、どのドキュメントをご覧になったのか、URLなどをご提示されるとよろしいかと思います。
退会済みユーザー

退会済みユーザー

2019/02/20 08:15

@quiqui様 ご指摘ありがとうございます。 追記致しました。 requests-oauthlibでOAuth認証を利用しています。 requests-oauthlibのバージョンは1.0.0です。
退会済みユーザー

退会済みユーザー

2019/02/20 08:23

@t_obara様 ご返信ありがとうございます。 確かにその通りでございます。クラスメソッドの振る舞いについて私の理解が及ばなかった事がエラーの原因である断定してしまい、 ライブラリのドキュメントを読むことを疎かにしていました。 当初参考にしていたのは下記の記事です。 https://qiita.com/ogrew/items/0b267f57b8aaa24f1b73
t_obara

2019/02/20 08:30

であれば、ドキュメントを読む前に、貴殿が提示したコードは参考にした記事の通りになっていませんよね。まぁ答えはすでに出ていますが。
退会済みユーザー

退会済みユーザー

2019/02/20 08:50

@t_obara様 記事に記載されているコードでは動作することを既に確認しておりまして、 Pythonの学習も兼ねて私の方で改悪したものが質問内容に提示したコードとなります。 失礼致しました。
guest

回答3

0

getメソッドの仕様を調べるために、とりあえずドキュメントを読みに行きました。

https://requests-oauthlib.readthedocs.io/en/latest/api.html#oauth-1-0-session

書いてなかったので、親クラスで定義されているのだろうと思いました。親クラスがドキュメントではわからなかったので(どこかに書いてあるんだろうけど、このページにはぱっと見なかった)、ソースを読みに行きました。

https://github.com/requests/requests-oauthlib/blob/master/requests_oauthlib/oauth1_session.py#L54

requests.Sessionを親にしていることがわかったので、こちらのドキュメントを見に行きました。

http://docs.python-requests.org/en/master/api/#requests.Session.get

get(url, **kwargs)[source] Sends a GET request. Returns Response object. Parameters: url – URL for the new Request object. **kwargs – Optional arguments that request takes. Return type: requests.Response

あとはcan110さんと同様の結論になりますが、**kwargsになにを渡したら良いのかわかりませんね。「requestの取るのと同じキーワード引数を取れる」ということなので、これを見に行きます。

http://docs.python-requests.org/en/master/api/#requests.request

きっとparamsで渡せば大丈夫だろうな、ということがわかります。

以上を踏まえて修正すると、

python

1 self.twitter.get(USER_TL, params=self.param)

になると思います。


全部書いてから、同じことやってるページを見つけた・・・

https://qiita.com/sugurunatsuno/items/55a46a63112ad378dca2
https://qiita.com/sugurunatsuno/items/2faa069b475bb45da552

投稿2019/02/20 09:31

編集2019/02/20 09:50
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/20 09:41

hayataka2049様 詳しく調べていただきまして、ありがとうございます!! 普通でしたら私の方がそのようにドキュメントや内部コードを辿って答えを探し出さなければいけないのですが…。 私自身、クラスの使い方ですら曖昧で理解に及ばない部分があり、説明不足でした。申し訳ありません。 次回、エラーメッセージに困惑することがありましたら、ご回答のようにドキュメントや内部コードを辿るようにしてみます。
guest

0

ベストアンサー

何故エラーが発生しているか、正しい書き方はどのような書き方か、

.get関数が以下のように定義されているためだと思われます。
以下では先頭2つself,param1が位置引数、それ以降がキーワード引数になっています。
この場合にget(1,'hoge')のように2つの位置引数を渡すとselfと合わせて3つの位置引数を渡したことになり提示エラーが発生します。

Python

1class Hoge(): 2 def __init(self): 3 pass 4 def get(self,param1,**kwargs): 5 print(param1,kwargs) 6 7h = Hoge() 8h.get(1,param2='hoge') # 1 {'param2': 'hoge'} 9h.get(1,'hoge') # TypeError: get() takes 2 positional arguments but 3 were given

対処方法としては.get(1,param2='hoge')のように2つ目をキーワード引数で渡せばよいです。

また、Classの使い方が間違っている等ありましたら、

後の処理なりで.getした結果が必要になると思われるので、戻り値として返すほうがよいと思います。

Python

1 def get_user_timeline(self): 2 #self.twitter.get(USER_TL,self.param) 3 return self.twitter.get(USER_TL,params=self.param)

投稿2019/02/20 03:09

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/20 09:21

can110様 的確なご回答ありがとうございます。 クラス変数に位置引数で引数を指定してしまうと、selfが溢れてしまい、引数の数が合わなくなるエラーだったのですね。大変勉強になりました。 質問内容に提示させて頂きましたコードの場合、確かにurl,paramsのキーワード引数が必要でした。 クラスについてのご指摘もありがとうございます。 getと関数名に明示にしているにも関わらず、何も返さない関数になっていました。 ご丁寧に深く掘り下げて説明いただきましてありがとうございました。
guest

0

エラーメッセージを読みましょうよ。

google翻訳
TypeError:get()は2つの位置引数を取りますが、3つが指定されました

投稿2019/02/20 03:45

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/20 08:42

y_waiwai様 説明不足で申し訳ありません。 引数が多すぎるのは理解しておりまして、 self.twitter.get()の引数に暗黙的にselfが渡されていることが原因であると把握しております。 それを踏まえて、クラス変数に外部関数を使う時にエラーとなってしまうロジックを知りたく思い、 質問させていただいた次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問