我有以下(严重简化)装饰器:
def log_and_execute(func):
def wrapper(*args, **kwargs):
print(*args, **kwargs)
return func(*args, **kwargs)
return wrapper
我想用它来装饰pyodbc.connect.cursor
。
由于我显然无法编辑源代码来执行此操作,因此我尝试这样做:
import pyodbc
connection = pyodbc.connect("connection_string_here")
cursor = connection.cursor()
cursor.execute = log_and_execute(cursor.execute)
但是我收到以下错误:
AttributeError: 'pyodbc.Cursor' object attribute 'execute' is read-only
我应该怎么做,这样我就不必改变所有已经存在的cursor.execute
电话?
你不能改变pyodbc Cursor
类,它是用C语言编写的,不允许设置属性。
你最好写一个包装类:
class CursorWrapper:
def __init__(self, cursor):
self.cursor = cursor
def execute(self, *args, **kwargs):
print(*args, **kwargs)
return self.cursor.execute(*args, **kwargs)
def __getattr__(self, attr):
return getattr(self.cursor, attr)
def __iter__(self):
return iter(self.cursor)
def __enter__(self):
return self.cursor.__enter__()
def __exit__(self, *args, **kwargs):
return self.cursor.__exit__(*args, **kwargs)
然后每次将光标包装在该类中:
cursor = CursorWrapper(connection.cursor())