-1

OK、クラスメソッドの装飾に関するすべての質問をすでに読んだことがありますが、私の場合はそれらが好きではありません。

def safe_db(foo):
    def _inner(*args, **kwargs):
        try:
            foo(args, kwargs)
            return True
        except Exception as e:
            log.error(e.message)
            print e.message
            return False
    return _inner


class BaseDB(object):
    def __init__(self):
        self.connection = Connection()
        self.db = self.connection.goobi
        self.table = None

    @safe_db
    def create(self, **data):
        self.table.insert(data)

    def update(self, where, **data):
        try:
            self.table.update(where, {'$set': data})
            return True
        except Exception as e:
           log.error(e.message)
           print e.message
           return False

次に、継承されたクラスUserからメソッドcreateを呼び出してみます。

u = User()
u.create(email='i@example.com', password='secrete')

例外が発生します:

2012-09-08 18:17:18,230 ERROR [hairs.model.user][worker 2] create() takes exactly 1      argument (2 given)
    create() takes exactly 1 argument (2 given)

BaseDBのクラスメソッドをどのように装飾できるか、または例外をキャッチしてロギングの負担を軽減する方法を理解できませんか?

4

2 に答える 2

2

デコレータにエラーがあります:

def safe_db(foo):
    def _inner(*args, **kwargs):
        try:
            foo(*args, **kwargs)   # fixed line
            return True
        except Exception as e:
            log.error(e.message)
            print e.message
            return False
    return _inner
于 2012-09-08T15:05:56.427 に答える
-1

関数を として呼び出す必要がありますcreate(email='i@example.com', password='secret')。ラッパー関数を として呼び出していますがu._inner(email='i@example.com', password='secret')、これは (メソッドを呼び出しているため) に自動的に変換され_inner(u, email='i@example.com', password='secret')ます。

のパラメータに追加する必要がありselfます。_inner_inner(self, ...

ただし、エラーとそれに表示される数字を考えると、表示されているコードでエラーが発生していない可能性があります。一部のサブコールで発生している可能性があります (関数に出入りするときに print ステートメントを追加することで確認できます)。

于 2012-09-08T14:32:03.303 に答える