从模块B读取和写入模块A中的变量

时间:2017-06-14 19:22:59

标签: python

需要一个解决方案或解决方法来从moduleB中读取和编写moduleA中的变量。这是代码:

moduleA

import moduleB

variable = 10

def changeVariable():
    global variable
    variable = 20

def main():
    print("From moduleA, variable =", variable, " before change.")
    moduleB.main()
    print("From moduleA, variable =", variable, " after change.")

if __name__ == "__main__":
    main()

moduleB

import moduleA

def main():
    print("From moduleB, variable =", moduleA.variable, " before change.")
    moduleA.variable = 20 # Try 1
    moduleA.changeVariable() # Try 2
    print("From moduleB, variable =", moduleA.variable, " after change.")

if __name__ == "__main__":
    main()

运行moduleA时,我们得到:

  • 来自moduleA,变量前变量= 10。
  • 来自moduleB,变量前变量= 10。
  • 来自moduleB,变更后变量= 20。
  • 来自moduleA,变更后变量= 10.

这是使用静态变量的另一个例子:

moduleAA

import moduleBB

class AA:
    variable = 0

    @staticmethod
    def changeVariable():
        AA.variable = 20

def main():
    AA.variable = 10
    print("From moduleAA, variable =", AA.variable, " before change.")
    moduleBB.main()
    print("From moduleAA, variable =", AA.variable, " after change.")

if __name__ == "__main__":
    main()

moduleBB

import moduleAA

def main():
    print("From moduleB, variable =", moduleAA.AA.variable, " before change.")
    moduleAA.AA.variable = 20 # Try 1
    moduleAA.AA.changeVariable() # Try 2
    print("From moduleB, variable =", moduleAA.AA.variable, " after change.")

if __name__ == "__main__":
    main()

运行moduleAA时,我们得到:

  • 来自moduleAA,变更前变量= 10。
  • 来自moduleBB,变更前变量= 0。
  • 来自moduleBB,变更后变量= 20.
  • 来自moduleAA,变更后变量= 10。

1 个答案:

答案 0 :(得分:1)

当您执行moduleA时,您将其作为脚本运行 - 本质上是一个名为__main__的模块,而不是正常的'模块,以及它是如何加载的。如果您在开始sys.modules后立即查看moduleB(导入moduleA之前),那么您将找不到__main__,但您会找到模块variable(很快就会持有值为10的{​​{1}}。

然后当您导入moduleB时,它会导入moduleA - Python会尝试查找已加载的moduleA但是没有任何内容,所以它会尝试从中加载moduleA磁盘和瞧!它被加载,但这次是moduleB。 Python然后查找从moduleA导入的moduleA,并且因为它已经存在,所以尽管存在循环依赖性,它并没有对它做任何大惊小怪(如果你有类似的东西)在你的代码中 - 你做错了。)

无论如何,由于它现在已加载为if __name__ == "__main__":,因此其moduleB块的评估结果为false,因此不会引起任何额外的麻烦。 if __name__ == "__main__":继续执行,但它也不匹配其__main__块,因此只是加载并坐在那里。

现在我们回到我们moduleA if __name__ == "__main__":的{​​{1}}表示中 - 其main()块的计算结果为true,因此它调用其moduleB函数,调用main()' variable函数,然后更改moduleA值,但在__main__,而不是__main__。所以,现在当它回到variable并尝试读取自己的10值时,它会获得print(getattr(sys.modules["moduleA"], "variable"))的未更改版本。但是如果你要打印出来:moduleB你发现moduleA确实改变了main的变量。

如果您真的想在moduleB强制进行更改,请尝试使用import sys def main(): moduleA = sys.modules["__main__"] # this is the executing `moduleA` in your case print("From moduleB, variable =", moduleA.variable, " before change.") moduleA.variable = 20 print("From moduleB, variable =", moduleA.variable, " after change.") if __name__ == "__main__": main()

moduleA

('From moduleA, variable =', 10, ' before change.') ('From moduleB, variable =', 10, ' before change.') ('From moduleB, variable =', 20, ' after change.') ('From moduleA, variable =', 20, ' after change.') 运行您的测试用例将打印出来:

moduleB

这就是这里发生了什么,而静态变量的例子也是如此 - 你一直都在针对“错误”这个问题做出反应。模块构成您的CREATE NONCLUSTERED INDEX OPTIM_1 ON MemberBetDetail(MemberCode ASC, CurrencyCode ASC, BetStatusId ASC) INCLUDE (colYouNeed1, colYouNeed2, ColYouNeed3) 。无论哪种方式,请不要在任何类型的生产代码或任何其他开发人员可能最终不得不弄乱您的代码的情况下执行此操作 - 循环冗余是所有事情的好事。