2012-09-08 47 views
-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='[email protected]', 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類方法,或我怎樣才能使異常捕獲並記錄更少痛苦?

回答

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 
+0

許多thx,我的注意力不對了讓我錯 – Denis

-1

您希望將您的功能稱爲create(email='[email protected]', password='secret')。你正在調用包裝函數u._inner(email='[email protected]', password='secret'),它會自動翻譯(因爲你正在調用一個方法)到_inner(u, email='[email protected]', password='secret')

您應該添加self_inner的參數,例如, _inner(self, ...

但是,考慮到您的錯誤和出現在其中的數字,可能是您的錯誤沒有出現在您向我們展示的任何代碼中;它可能發生在某些子調用中(當您輸入/退出函數時,您可以通過添加打印語句來檢查它)。

+0

這並不工作,我也得到相同的異常2012年9月8日18:38:38040 ERROR [hairs.model.user] [工人1]創建( )只需要1個參數(給出2) create()只需要1個參數(2給出) – Denis