変数を受け入れることができるクラス内のデコレータを使用しています。クラス内の変数を初期化したいと思います。クラス内のデコレータ変数を初期化する
以下は私が現在取り組んでいる作業の例です(現在作業中です)。
_RETRIES = 3
class MyClass(object):
def __init__(self, foo):
self._foo=foo
@retry.FuzzedIntervalsOnException(num_retries=_RETRIES)
def my_method(self):
return some_data
しかし私は、クライアントが再試行の回数を決めることができるようにdef __init__(self, foo, retries=3)
のようなものを受け入れるようにこれを変更したいと思います。しかしこれを実装すると、未定義の変数エラーがスローされます。使用するクラス変数を初期化するための理想的な方法はあり
class MyClass(object):
def __init__(self, foo, retries=3):
self._foo=foo
self.retries=retries
@retry.FuzzedIntervalsOnException(num_retries=self.retries)
def my_method(self):
return some_data
:私は以下のようなものを得ることを望んだ
は、しかし、正しい答えはこれよりも複雑になりますように思えますデコレータ内で?事前
EDITで
感謝:再試行の詳細について は、以下の初期設定です。
class FuzzedIntervalsOnException(object):
"""Retry on exception
args:
delay: Time delay in seconds for each retry.
num_retries: Total number of retries.
"""
def __init__(self, delay, num_retries):
...
あなたは、それを受け入れるのではなく、 '自己からnum_retries'を取得するために、再試行デコレータを変更することができます外の呼び出し? –
デコレータ呼び出しで 'self.retries'を参照することはできません。これはクラス定義時に発生するためですが、クラスをインスタンス化するまで' self'はありません。しかし 'num_retries'が与えられていなければ、装飾された関数が呼び出されたときに' self'を見るように 'retry'を書くことができます。あなたは '再試行'自体の実装の(おそらくスケッチな)デモンストレーションを与えることができますか?今は '再試行'が実際にどのように動作するかについては何も表示しません。 – BrenBarn
ああ、それは面白いです。はい、私はそれがまさに私が走っているものだと思うし、これらの2つの解決策の1つがうまくいくように思えます。私は今質問に加えて、再試行の実装に関する追加情報を追加します..... – Seano314