簡體   English   中英

python3裝飾器中方法調用中參數“self”沒有值

[英]No value for argument 'self' in method call in python3 decorator

我正在嘗試在課堂上使用裝飾器,但在線 pylint 中出現錯誤

@start_test_min_pg(min_version_pg="9.5")

方法調用中參數“self”沒有值

class TestsUnloggedTabled(BaseTester):
   some code

   def get_pg_version(self):
       pg_temp = Postgres(self.host, self.port, self.username, self.password, "postgres")
       current_pg_version = pg_temp.query("show server_version")[0][0].split(" ")[0]
       print('PG version is: ' + current_pg_version)
       return current_pg_version

   def start_test_min_pg(self, min_version_pg):
       def decorator_repeat(func):
           @functools.wraps(func)
           def wrapper_repeat(*args, **kwargs):
               if LooseVersion(self.get_pg_version()) > LooseVersion(min_version_pg):
                   value = func(*args, **kwargs)
                   return value
               return wrapper_repeat
           return decorator_repeat

   @start_test_min_pg(min_version_pg="9.5")
   def test_schema_hashing(self):
       do something

按照您編寫裝飾器的方式,需要在類的實例上調用它才能正常工作。 也就是說,你需要應用它:

obj = TestsUnloggedTabled(...)

@obj.start_test_min_pg(min_version_pg="9.5")
def foo():
    pass

當您將它應用於同一類中的另一個方法時,這顯然不起作用,因為在類定義結束之前您無法創建實例。 因此,您顯然不想將裝飾器作為方法調用,這意味着您不應該將self作為其參數之一。

但是您在以后的代碼實現中確實需要self 你從哪里得到它? 好吧,一旦定義了類,將在實際實例上調用wrapper_repeat函數。 因此,它的第一個參數將是該實例,您可以將其命名為self而不是讓它與args的其他位置參數一起收集。 您確實需要記住在調用原始函數時傳遞它。

def start_test_min_pg(min_version_pg):                            # no self here
   def decorator_repeat(func):
       @functools.wraps(func)
       def wrapper_repeat(self, *args, **kwargs):                 # put it here instead
           if LooseVersion(self.get_pg_version()) > LooseVersion(min_version_pg):
               value = func(self, *args, **kwargs)                # and pass it along
               return value
       return wrapper_repeat
   return decorator_repeat

請注意,我修復了此代碼最后兩行的縮進級別,您問題中的版本將無法正常工作(因為裝飾器工廠將返回None )。 我猜這可能是將代碼復制到 Stack Overflow 的人工產物,而不是您的真實代碼中實際上有問題的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM