我创建了一个装饰器来处理这样的数据库连接:
def with_connection(f):
def with_connection_(args, **kwargs):
conn = mysql.connector.Connect("my redacted credentials")
try:
result = f(conn, args, **kwargs)
except:
conn.rollback()
print("SQL failed")
raise
else:
conn.commit()
finally:
conn.close()
return result
return with_connection_
我这样称呼它:
@with_connection
def GetUsername(conn, args):
Cursor = conn.cursor()
query = "select user_name from users where user_id = %s"
Cursor.execute(query, (args[0],))
result = Cursor.fetchone()
return result
user_name = DBQueries.GetUsername(user_id)
此代码可以正常工作。
但是,在VS Code中,我收到了以下错误报告,我觉得我应该理解为什么会发生这种情况:
"message": "No value for argument 'args' in function call",
我有点理解,因为GetUsername有2个参数,conn和args,我用一个参数调用它,因此它认为它缺少args参数。但是有效。
谁能为我澄清这是怎么回事?
您的IDE基本上是困惑的,因为GetUsername
确实期望使用不同的参数。在某些IDE中,可以通过将内部函数包装为@functools.wraps(f)
来解决此问题。 (https://docs.python.org/3/library/functools.html#functools.wraps)。这基本上是对包装函数的元信息的适当照顾,因此它类似于原始函数的信息。