【发布时间】:2020-04-02 11:39:18
【问题描述】:
我正在 python 中实现一个数据库连接器类。我将使用tenacity库中的retry装饰器在超时时重试数据库连接。
我想将self.retry_count 和self.retry_interval 传递给retry 装饰器中的参数。
## etl_connect.py
from sqlalchemy import create_engine
import pymysql
import logging
from tenacity import *
class Connector():
def __init__(self, mode, conn_str, retry_count, retry_interval):
self.mode = mode
self.conn_str = conn_str
self.retry_count = retry_count
self.retry_interval = retry_interval
self.engine = None
self.conn = None
@retry(wait=wait_fixed(self.retry_interval), stop=stop_after_attempt(self.retry_count))
def mysql_connect(self):
logging.info('Connecting to mysql. (retry count=%d)' % (self.mysql_connect.retry.statistics['attempt_number']))
mysql_engine = create_engine(self.conn_str)
mysql_conn = mysql_engine.connect()
logging.info('Connected to mysql successfully with %d attempt(s).' % (self.mysql_connect.retry.statistics['attempt_number']))
return (mysql_engine, mysql_conn)
现在调用mysql_connect函数:
## call.py
from etl_connect import *
mysql_connector = Connector('mysql', 'mysql database string here', 5, 10)
engine, conn = mysql_connector.mysql_connect()
但它显示:NameError: name 'self' is not defined。
Traceback (most recent call last):
File "call.py", line 5, in <module>
from etl_connect import *
File "/home/developer/ETL_modules/etl_connect.py", line 19, in <module>
class Connector():
File "/home/developer/ETL_modules/etl_connect.py", line 56, in Connector
@retry(wait=wait_fixed(self.retry_interval), stop=stop_after_attempt(self.retry_count))
NameError: name 'self' is not defined
有什么方法可以将self.retry_count 和self.retry_interval 传递给装饰器?
【问题讨论】:
-
请注意,答案假设您正在编写装饰器;如果
retry是您要导入的东西,则需要定义包装它的 自己的 装饰器。
标签: python python-3.x python-decorators python-tenacity