Как дать функции Python функцию в качестве аргумента, который еще не вызывается? - PullRequest
0 голосов
/ 21 июня 2019

Я хотел бы вызвать функцию с другой функцией в качестве аргумента, которая еще не определена и не может быть вызвана. Есть ли питонический способ, как это сделать?

Я знаю, что вы можете дать функцию в качестве аргумента для другой функции, как показано в этом ответе:

Функция Python как аргумент функции?

Но это как-то невозможно для функций, которые еще не определены и не могут быть вызваны.

Недавно я написал много повторяющегося кода, и я почти уверен, что для этого должен быть более питонический способ.

Повторный код:

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())

Пример кода выше не работает, потому что курсор еще не определен, когда я даю его в качестве аргумента.

Кто-нибудь знает, как это сделать? Большое спасибо за ваши ответы.

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Поэтому я думаю, что проблема, с которой вы можете столкнуться, заключается в том, что вам нужен курсор для каждой функции, но вы не хотите повторять вызов для создания курсора каждый раз.Одним из способов противодействия этому была бы функция-обертка, предоставляющая курсор:

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

Таким образом, каждая функция принимает курсор в качестве первого аргумента, но затем может быть уверена, что он доступен.

1 голос
/ 21 июня 2019

Вы можете отложить разрешение имени функции с помощью простого 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...