-1

好的,我已经阅读了有关类方法装饰的所有问题,但我的情况不喜欢它们。

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

然后我尝试从继承的类用户调用方法创建:

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'). 您正在调用包装函数 as u._inner(email='i@example.com', password='secret'),它会自动翻译(因为您正在调用方法)为_inner(u, email='i@example.com', password='secret').

您应该添加self_inner的参数,例如_inner(self, ...

但是,鉴于您的错误和其中出现的数字,您向我们展示的任何代码中都可能没有出现您的错误;它可能发生在某些子调用中(您可以通过在输入/退出函数时添加打印语句来检查)。

于 2012-09-08T14:32:03.303 回答