我有两个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
答案 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函数中传递值。第三种方法是将变量设置为全局变量。