0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

処理中にエラーが起こった際の対処と前後処理のデコレータ

Posted at

とりあえず動いたので自分用メモ。そのうち編集するかも。

test.py
class UseOnlyClass(object):

    def __init__(self, use_number1):
        self.use_number1 = use_number1

def wraper(func):

    def inner(main_inst):

        # 処理1
        use_only_class_inst = UseOnlyClass(main_inst.number1)

        # 処理2
        try:
            func(main_inst, use_only_class_inst)
        except Exception:
            last_output = 100
        else:
            last_output = use_only_class_inst.use_number1 + 1

        # 処理3
        return last_output

    return inner

class Selenium(object):

    def __init__(self, number1, number2):
        self.number1 = number1
        self.number2 = number2

        # この辺で接続処理(ログインなど)

    def stop_program(self, last_number):
        print(last_number)

class TargetSite(Selenium):

    def __init__(self, number1, number2):
        super().__init__(number1, number2)

    @wraper
    def update_something(self, use_only_class_inst):

        # この辺でスクレイピング

        # raise Exception

        # スクレイピング結果を元に値を計算する
        use_only_class_inst.use_number1 += 1 + self.number2

    @wraper
    def update_something_else(self, use_only_class_inst):

        # この辺でスクレイピング

        # raise Exception

        # スクレイピング結果を元に値を計算する
        use_only_class_inst.use_number1 += 2 + self.number2

main_inst = TargetSite(123, 456)
main_inst.stop_program(main_inst.update_something())

main_inst2 = TargetSite(123, 456)
main_inst2.stop_program(main_inst2.update_something_else())

やりたかったことは、
 ・あるサイトにスクレイピングをかける
 ・その処理前後でデータ処理をする
   ・このデータは別クラスのオブジェクトとして持っておく
 ・最後にprint文で処理後のデータを表示する
 ・その関数実行中にエラーが起こった際の処理を行う

もう少し詳しく言うと大きく分けて3つ処理がある
 1. 別から呼ばれてきた値(上記の例だと123)を別クラスのメンバ変数化する
 2. この値を利用してスクレイピングをかける
 3. 1. の値と2. のスクレイピング結果により計算された値を出力する

UseOnlyClassとSeleniumクラスはどちらかがどちらかを継承していれば
もっと簡単に書けるのだが、現場の諸事情によりそれができない。

上記の例だと引数も2つだけになっているが現実にはもっと種類があり、
UseOnlyClassクラスのメンバ変数化して最終的に出力する値の計算に使いたいものもあれば、
TargetSiteクラスのメンバ変数だけにしておいて、サイト接続等にだけ使いたい値もある。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?