Есть ли способ для функции внутри функции узнать переменные, переданные в родительскую функцию - PullRequest
1 голос
/ 01 апреля 2019

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

Прямо сейчас я передаю переменную в качестве входных данных для первой функции, и она передаетсяво вторую функцию.

Структура моего текущего кода:

def DB_Connection(source):

    conn = pyodbc.connect(dsn=source)

    return conn


def DB_Query(source, sql_string):

    conn = DB_Connection(source)
    data = pd.read_sql(sql_string, conn)

    return data

Это работает как ожидалось;однако я не знал, была ли это лучшая практика.Вместо этого есть ли способ сделать следующее, где DB_Connection() знает source, потому что он был передан в DB_Query():

def DB_Connection(source):

    conn = pyodbc.connect(dsn=source)

    return conn


def DB_Query(source, sql_string):

    conn = DB_Connection()
    data = pd.read_sql(sql_string, conn)

    return data

Ответы [ 5 ]

2 голосов
/ 01 апреля 2019

Это один из вариантов использования класса для обмена данными между методами.

class DBConnection:
    def __init__(self, source):
        self.source = source

    def get_connection(self):
        return pyodbc.connect(dsn=self.source)

    def query(self, sql_string):
        return pd.read_sql(sql_string, self.get_connection())


db = DBConnection(...)
db.query("SELECT foo from bar")

Этот класс также облегчает совместное использование одного соединения между запросами, вместо того, чтобы query каждый раз открывать новое соединение.

class DBConnection:
    def __init__(self, source):
        self.source = pyodbc.connect(dsn=source)

    def get_connection(self):
        return self.source

    def query(self, sql_string):
        return pd.read_sql(sql_string, self.source)
2 голосов
/ 01 апреля 2019

Одним из возможных решений является определение DB_Connection внутри тела DB_Query. Тогда DB_Connection автоматически получит доступ ко всем переменным, локальным для DB_Query.

def DB_Query(source, sql_string):

    def DB_Connection():
        conn = pyodbc.connect(dsn=source)
        return conn

    conn = DB_Connection()
    data = pd.read_sql(sql_string, conn)

    return data

Недостатком является то, что DB_Connection будет недоступен везде в вашем коде. Так что это только подходящее решение, если DB_Query - единственный контекст, заинтересованный в вызове DB_Connection.

0 голосов
/ 01 апреля 2019

Для этого вам нужно немного изменить способ реализации кода вашей функции. Поэтому вы можете вызвать вторую функцию внутри первой. Так что переменная передается от первой функции, которой было передано значение ранее (вызывалось ранее). Другим подходом (хотя и не очень хорошим) будет использование вложенных функций. Тогда даже не нужно передавать значение во вторую функцию, которая определена внутри. Третий подход заключается в том, чтобы переменная была глобальной.

0 голосов
/ 01 апреля 2019

Все, что передается на DB_Query, может быть передано (снова) на DB_Connection, как вы сделали в своем примере.Что касается DB_Connection автоматического получения параметра, то это невозможно.Это было бы возможно, если бы параметр DB_Connection был постоянной / глобальной переменной, к которой он может получить доступ.

0 голосов
/ 01 апреля 2019

Вы можете использовать глобальную переменную:

global_source = None

def DB_Connection():

    source = global_source
    conn = pyodbc.connect(dsn=source)

    return conn


def DB_Query(source, sql_string):

    global global_source
    global_source = source

    conn = DB_Connection()
    data = pd.read_sql(sql_string, conn)

    return data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...