函数内部的函数是否有办法知道传递给父函数的变量

时间:2019-04-01 15:26:19

标签: python variables parameters

我有两个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 个答案:

答案 0 :(得分:2)

一种可能的解决方案是在DB_Query主体内定义DB_Connection。然后,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感兴趣的上下文时,这才是合适的解决方案。

答案 1 :(得分:2)

这是类的用例之一,可以在方法之间共享数据。

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 :(得分:0)

您可以使用全局变量:

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

答案 3 :(得分:0)

任何传递到DB_Query的内容都可以(再次)传递到DB_Connection,如您在示例中所做的那样。至于DB_Connection自动接收参数,这是不可能的。 DB_Connection的参数可能是可以访问的常量/全局变量。

答案 4 :(得分:0)

为此,您需要对实现功能代码的方式进行一些更改。因此,您可以做的一件事是在第一个函数内部调用第二个函数。以便将变量从第一个函数传递到值已更早(称为更早)传递的函数。另一种方法(虽然不是很好)将使用嵌套函数。然后,甚至不需要在内部定义的Second函数中传递值。第三种方法是将变量设置为全局变量。