好的,我已经阅读了有关课程方法装饰的所有问题,但我的情况并不像他们。
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:
创建调用方法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的类方法,或者我如何使异常捕获和记录更少痛苦?
答案 0 :(得分: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
答案 1 :(得分:-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语句来检查)。