当前位置:  开发笔记 > 编程语言 > 正文

如何从另一个模块的对象中更改模块变量的值?

如何解决《如何从另一个模块的对象中更改模块变量的值?》经验,为你挑选了1个好方法。

摘要:我有一个脚本公开了(1) a dict,我需要dict使用另一个模块对其进行修改

注意:对一个类似问题的两个很好的答案解释了很多关于模块之间变量作用域的信息,但是我不明白这对我的情况如何适用。

在下面的代码,我期望我将能够修改mainmodule.py变量 container从内submodule.py,这是并非如此。为什么?

我应该如何从内部解决mainmodule实例?containersubmodule

主脚本的代码

# mainmodule.py
# the main script which ultimately exposes the module variable 'container'
import submodule

container = dict()

class MainClass:
    def __init__(self):
        self.sub = submodule.SubClass()

    def set(self, number):
        print("main: container was {container}".format(container=container))
        container['x'] = number
        print("main: container is {container}".format(container=container))


    def call(self, number):
        self.sub.set(number)

if __name__ == "__main__":
    mc = MainClass()
    # updating container from this script
    mc.set(1)
    # updating container from another module
    mc.call(2)
    # again from this script, to check the updates
    mc.set(3)

导入模块的代码

# submodule.py
import mainmodule

class SubClass:
    def __init__(self):
        pass

    def set(self, number):
        print("sub: container was {container}".format(container=mainmodule.container))
        mainmodule.container['x'] = number
        print("sub: container is {container}".format(container=mainmodule.container))

输出是

main: container was {}
main: container is {'x': 1}
sub: container was {}
sub: container is {'x': 2}
main: container was {'x': 1}
main: container is {'x': 3}

(1)的实际代码的用途bottle,以提供container经由 json.dumps()



1> SingleNegati..:

盯着你的代码,我想我知道是什么让你失望。作为调用的Python脚本python foo.py最终会被一个模块(sys.modules)呼吁__main__。这意味着您的mainmodule.py节目的最低位将通过加载,编译和运行一次__name__ == "__main__",这会导致某些事情发生。该模块import submodule,尚未导入,因此可以加载并运行。

submodule依次尝试导入mainmodule。尽管该文件之前已执行过,但解释器不知道该模块的名称,因此mainmodule.py这次再次运行__name__ == "mainmodule"(与相同"__main__",因此if跳过了底部的套件)。

这意味着您有两个副本container,一个在名为的模块中__main__,一个在名为的模块中mainmodule。两者都来自名为的文件的事实./mainmodule.py并不重要。

有几种方法可以解决此问题。一种是始终立即导入实数,如:

# mainmodule.py
import submodule
class Foo:
    pass
if __name__ == "__main__":
    import mainmodule
    mainmodule.Foo()

另一个选择是将其中的代码移动if到另一个文件。

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有