从 Spyder 中的另一个模块更改全局变量

问题描述 投票:0回答:1

我有一个模块,仅包含用作设置的变量

#Settings.py 
settings = {'a' : 0, 'b': True}

这些变量在代码中以类似的方式调用:

from Settings import settings 
def f(x): 
    return settings['a'] * x 

我有一个功能可以通过修改不同的设置来测试它们

#main.py
def test() : 
    import Settings 
    Settings.settings['a'] = 2 
    f(x)
    Settings.settings['a'] = 4
    f(x) 
    Settings.settings['b'] = False 
    f(x)
    .... 

test()

此代码适用于我的 Unix 部署系统,对设置所做的修改将传播到代码的其余部分。我在 Ipython 控制台上使用 Spyder 在 Windows 10 上进行编码和测试。

在我的测试环境中,不考虑更改,并且 main.py 中的设置从未修改。

Spyder / Ipython 不考虑对设置所做的更改会发生什么?我如何确保将来不会发生这种情况?

python python-3.x ipython spyder
1个回答
0
投票

这与spyder缓存加载变量的方式有关。当spyder加载到特定模块时,缓存不会被调整。我已经遇到过几次这个错误,通常通过重置spyder来清除缓存对我来说很有效。

解决此问题的最佳方法是使用本地设置类,您可以像这样进行调整:

class Settings:
    def __init__(self):
        self.a = 1
        self.b = True

然后你可以这样做:

from Settings import Settings

def f(x, settings):
    return settings.a * x

def test():
    settings = Settings()  # Create an instance of Settings

    # Modify the settings and use them
    settings.a = 2
    print(f"settings.a after setting to 2: {settings.a}")
    print(f(x, settings))  # Use the settings instance in the function

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.