我有2个文件:
Main.py
from test import test
def main():
sol = 'hello'
if test() == sol:
print('Yes')
else:
print('No')
test.py
def test():
return 'hello'
在我的测试功能中是否可以访问另一个文件中的 sol 变量?我想做这样的事情:
def test():
return sol
这样,它总是与Main.py中的变量相同。我尝试了Python extract variables from an imported file中提到的解决方案,但对我而言不起作用。谢谢您的帮助
编辑:我想在不更改Main.py文件的情况下完成
答案 0 :(得分:2)
由于函数中未定义sol
,因此您需要将其声明为全局函数,以便可以在函数中使用它。将test.py
更改为以下内容...
test():
global sol
return sol
希望有帮助。
答案 1 :(得分:2)
如果sol是一个常数(即在程序执行过程中不会改变的变量),则可以将其放入一个单独的文件(例如var.py)中,并将其导入main.py和test中。 py:
from var import sol
但是,您要导入的是变量的副本,该副本具有导入时变量的值-任何后续重新分配都不会更新test.py和main.py中sol的值。因为字符串是不可变的,所以当您为它重新分配一个值时,实际上是在为新实体重用变量名。
您需要做的是将变量设置为可变结构(例如列表或类),因此您的var.py如下所示:
class v(object):
sol = 'Hello'
,然后在main.py和test.py中,您可以使用以下命令引用sol:
from var import v
print(v.sol)
这样,对v.sol的任何更改都将正确地反映在导入v类的任何位置。有点麻烦,但是在Python中就是这样。
答案 2 :(得分:0)
您可以使用inspect
模块从sol
函数获取main
变量,而无需更改main.py
的任何内容。当然,您需要调用main
函数。
Main.py:
from test import test
def main():
sol = 'hello'
if test() == sol:
print('Yes')
else:
print('No')
main()
test.py:
import inspect
def test():
frame = inspect.currentframe()
sol_from_main = 'default'
try:
sol_from_main = frame.f_back.f_locals['sol'] # line A
except:
print('No sol found')
print(sol_from_main) # this print 'hello'
return sol_from_main
输出:
你好
是
说明:
在python doc中,我们可以看到下一个:
框架
f_back |下一个外部框架对象(此框架的调用者)
f_locals |此框架看到的本地名称空间
因此line A
获取当前函数的调用者,即main function
,并使用f_locals
获取main function
的所有局部变量,因此它可以获取{{来自sol
的1}}值。仅供参考,以防您仍然需要。