有以下功能
def pg_select(sql: str, data: dict = {}) -> list:
"""
SELECT
:param sql: sql-запрос
:param data: Данные sql-запроса. Нужно для того, чтобы избежать sql-injection
:return: None, list
"""
con = psycopg2.connect(user=DB_USER, password=DB_PASSWD,
database=DB_NAME, host=DB_HOST, port=DB_PORT)
cur = con.cursor()
cur.execute(sql, data)
rows = cur.fetchall()
con.close()
return rows
PyCharm 内置的 Pylint 抱怨数据参数,说dangerous-default-value
如果您允许它自动修复代码,您将获得以下信息:
def pg_select(sql: str, data = None) -> list:
"""
SELECT
:param sql: sql-запрос
:param data: Данные sql-запроса. Нужно для того, чтобы избежать sql-injection
:return: None, list
"""
if data is None:
data = {}
con = psycopg2.connect(user=DB_USER, password=DB_PASSWD,
database=DB_NAME, host=DB_HOST, port=DB_PORT)
cur = con.cursor()
cur.execute(sql, data)
rows = cur.fetchall()
con.close()
return rows
我不明白我的选择有多危险data: dict = {}
解释:为什么完全按照 IDE 的建议做是正确的,我的错误是什么?
默认参数创建一次。因此,如果您选择可变数据类型(字典或列表)作为默认参数,那么它将对所有函数调用都是通用的。因此,如果您使用默认参数调用该函数并在其中向该参数添加元素,那么下次调用该函数时它们将在那里。
因此,建议您永远不要使用可变类型对象作为默认参数,以免意外遇到此行为。