[英]How to give a Python function a function as an argument which is not yet callable?
我想用另一个函数作为参数调用一个函数,该函数尚未定义和可调用。 有没有一种pythonic的方法来做到这一点?
我知道您可以将一个函数作为另一个函数的参数,就像这个答案所暗示的那样:
但是对于尚未定义和可调用的函数,这在某种程度上是不可能的。
我最近写了很多重复的代码,我很确定一定有一种更 Pythonic 的方法来做到这一点。
重复代码:
import pymysql
def database_connection():
return pymysql.connect(db="MyDatabase", user='root', host="127.0.0.1", password="SecretPassword")
def mysql_request_true(sql_text):
connection = database_connection()
try:
with connection.cursor() as cursor:
cursor.execute(sql_text)
result = True
connection.commit()
return result
except ConnectionError:
return False
finally:
connection.close()
def mysql_request_database_id(sql_text):
connection = database_connection()
try:
with connection.cursor() as cursor:
cursor.execute(sql_text)
result = cursor.lastrowid
connection.commit()
return result
except ConnectionError:
return False
finally:
connection.close()
def mysql_request_fetchone(sql_text):
connection = database_connection()
try:
with connection.cursor() as cursor:
cursor.execute(sql_text)
result = cursor.fetchone()
connection.commit()
return result
except ConnectionError:
return False
finally:
connection.close()
def mysql_request_fetchall(sql_text):
connection = database_connection()
try:
with connection.cursor() as cursor:
cursor.execute(sql_text)
result = cursor.fetchall()
connection.commit()
return result
except ConnectionError:
return False
finally:
connection.close()
我试图实现的目标:
import pymysql
def database_connection():
return pymysql.connect(db="MyDatabase", user='root', host="127.0.0.1", password="SecretPassword")
def mysql_request(sql_text, cmd):
connection = database_connection()
try:
with connection.cursor() as cursor:
cursor.execute(sql_text)
result = cmd
connection.commit()
return result
except ConnectionError:
return False
finally:
connection.close()
def mysql_request_true(sql_text):
return mysql_request(sql_text, True)
def mysql_request_database_id(sql_text):
return mysql_request(sql_text, cmd=cursor.lastrowid)
def mysql_request_fetchone(sql_text):
return mysql_request(sql_text, cmd=cursor.fetchone())
def mysql_request_fetchall(sql_text):
return mysql_request(sql_text, cmd=cursor.fetchall())
上面的代码示例不起作用,因为当我将它作为参数提供时,游标尚未定义。
有人知道怎么做这个吗? 非常感谢您的回答。
所以我认为您可能遇到的问题是每个函数都需要一个游标,但不想每次都重复调用以创建游标。 抵消这种情况的一种方法是提供一个游标的包装函数:
from functools import wraps
def with_cursor(func):
@wraps(func)
def decorator_function(self, *args, **kwargs):
cursor = connection.cursor()
context = func(self, cursor, *args, **kwargs)
cursor.close()
return context
return decorator_function
这样,每个函数都将光标作为第一个参数,但可以确保它可用。
您可以使用简单的lambda
延迟解析函数的名称:
def my_func(param, cmd=lambda: this_is_not_yet_defined_fn):
print(cmd()(param))
this_is_not_yet_defined_fn = sum
my_func([1, 2])
印刷:
3
我认为您可以使用lambda
获得所需的行为。 只需将提取所需cursor
特征的函数作为参数传递给mysql_request
函数,如下所示:
def mysql_request(sql_text, cmd):
connection = database_connection()
try:
with connection.cursor() as cursor:
cursor.execute(sql_text)
result = cmd(cursor) # Call cmd which extracts the desired information
connection.commit()
return result
except ConnectionError:
return False
finally:
connection.close()
然后您可以将cmd
参数作为 lambda 函数传递:
def mysql_request_true(sql_text):
return mysql_request(sql_text, lambda cursor:True)
def mysql_request_database_id(sql_text):
return mysql_request(sql_text, lambda cursor:cursor.lastrowid)
def mysql_request_fetchone(sql_text):
return mysql_request(sql_text, lambda cursor:cursor.fetchone())
def mysql_request_fetchall(sql_text):
return mysql_request(sql_text, lambda cursor:cursor.fetchall())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.