前提・実現したいこと
現在GoogleCloudTranslateAPIを使用して大量の言葉を翻訳するシステムを作成しています。
その過程でGoogleAPIの割り当てと制限等の影響で翻訳機能を使った際の動作が不安定だということが判明し、
retryingモジュールを使用して、翻訳部分について設定ファイルより取得した値だけリトライを行う処理を検討しており、その過程で外部サイトを参考にテストコードを作成しました。
該当のソースコード
参考サイト
参考サイト2
上記を元にコンストラクタで設定したクラス変数をretryデコレータにセットしようとすると静的解析でエラーが発生します。
最終的には独立したクラスモジュールに組み込みたいため、上記の**(コンストラクタでデコレータのパラメータをセットする)**という機能は必須になります。
python
1# 指定したURLに接続しレスポンスが帰ってくるまでリトライするコード 2 3#!/usr/bin/env python 4# -*- coding: utf-8 -*- 5 6import logging 7import requests 8import sys 9import time 10from retrying import retry, RetryError 11from requests.exceptions import HTTPError 12 13logging.basicConfig(level=logging.INFO) 14 15 16class TestRunner(object): 17 __maxdelay = 0 18 __retrycount = 0 19 20 def __init__(self): 21 self.__maxdelay = 10000 22 self.__retrycount = 3 23 24 # 例外時3回,合計10秒(10,000ミリ秒)リトライを行う(例外内容をRetryErrorにラップする) 25 # ※(問題箇所)マジックナンバー行けるが、クラス変数はNG 26 @retry(stop_max_delay=self.__maxdelay, stop_max_attempt_number=self.__retrycount, wrap_exception=True) 27 def get(self, url): 28 print("call function") 29 logging.info(time.time()) 30 response = requests.get(url) 31 if (response.status_code != requests.codes.ok): 32 raise response.raise_for_status() 33 return response 34 35if __name__ == "__main__": 36 # 強制的に例外引き起こすためのパラメータ 37 url = "https://dev.classmethod.jp/server-side/python/python-retrying-le/" 38 39 runner = TestRunner() 40 try: 41 response = runner.get(url) 42 print(response.headers) 43 except HTTPError as e: 44 print("ERROR:HTTP") 45 print(e) 46 except RetryError as e: 47 # パラメータでRetryErrorにラップさせているため、例外発生時はここを通ってからリトライをする 48 print("ERROR:RETRY") 49 print(e) 50 except Exception as e: 51 print("ERROR:OTHER") 52 print(e)
発生している問題・エラーメッセージ
NameError: name 'self' is not defined
selfは使えないと言われています。
試しにselfを消して記述しても当然ながらコンストラクタでセットしたパラメータは適応されていません(初期値がセットされます)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。