找不到最近几年编写的任何解决方案。
我希望将变量从一个函数传递给另一个函数,而无需重新运行SQL连接。
第一个功能是:
def SQL_Country():
conn = psq.connect("localhost","root","root","world",cursorclass=psq.cursors.DictCursor)
query = "SELECT * FROM country"
with conn:
cursor = conn.cursor()
cursor.execute(query)
country = cursor.fetchall()
global df
df = pd.DataFrame(country, columns=["Code", "Name", "Continent", "Population", "HeadOfState"])
第二个函数,我希望传递SQL_Country()
的输出是:
def assignment():
## do something here
elif Choice == 6:
try:
x = df
except NameError:
x = None
if x is None:
print()
df = SQL_Country(df)
我遇到以下错误:
File "Python.py", line 185, in assignment
df = SQL_Country(df)
UnboundLocalError: local variable 'df' referenced before assignment
关于如何将输出从一个功能传递到另一个功能的任何建议?
答案 0 :(得分:2)
第二个函数缺少参数:
def assignment(df):
答案 1 :(得分:2)
而不是全局,应该在SQL_County内部返回df:
global df
df = pd.DataFrame(country, columns=["Code", "Name", "Continent", "Population", "HeadOfState"])
应为:
return pd.DataFrame(country, columns=["Code", "Name", "Continent", "Population", "HeadOfState"])
然后使用:
df = SQL_Country()
如果要缓存df的结果,我将使用lru_cache:
import functools
@functools.lru_cache(maxsize=1)
def SQL_Country():
...
那样,数据库获取仅执行一次。
In [11]: @functools.lru_cache(maxsize=1)
def foo():
print(1)
return 2
In [12]: foo()
1
Out[12]: 2
In [13]: foo()
Out[13]: 2
答案 2 :(得分:2)
我认为您应该review python functions。
您正在使用定义函数
def SQL_Country():
但是,当您要使用该函数时,您将在以下位置提供参数(不希望作为函数输入):
df = SQL_Country(df)
您的其他功能:
def assignment():
可能还应该输入一个数据框,使其看起来像这样:
def assignment(df):
此时对函数的后续调用将是:
assignment(df)
代替
assignment()
答案 3 :(得分:2)
由于已经设置了SQL_Country()
,因此无需再次运行df
函数。因此,我将进行检查以查看是否已设置,如果已设置,则将其返回。首先在函数外部定义df,而不要使用全局值。
df_country = None
def SQL_Country():
if df_country is None:
conn = psq.connect("localhost","root","root","world",cursorclass=psq.cursors.DictCursor)
query = "SELECT * FROM country"
with conn:
cursor = conn.cursor()
cursor.execute(query)
country = cursor.fetchall()
df_country = pd.DataFrame(country, columns=["Code", "Name", "Continent", "Population", "HeadOfState"])
return df_country
现在,当您调用该函数时,它不会第二次执行,但是您将获得所需的值
def assignment():
## do something here
if Choice == 6:
# No need to do the name check
x = SQL_Country()
if x is None:
print()