[英]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.