【问题标题】:Python: How can I use variable from main file in module?Python:如何在模块中使用主文件中的变量?
【发布时间】:2011-05-15 21:27:36
【问题描述】:

我有 2 个文件 main.py 和 irc.py。
main.py

import irc
var = 1
func()

irc.py

def func():
    print var

当我尝试运行 main.py 时出现此错误

NameError:未定义全局名称“var”

如何让它发挥作用?

@编辑
我认为有一个更好的解决方案,但不幸的是我发现的唯一一个是制作另一个文件并将其导入两个文件
main.py

import irc
import another
another.var = 1
irc.func()

irc.py

import another
def func():
    print another.var

另一个.py

var = 0

【问题讨论】:

    标签: python global-variables


    【解决方案1】:

    不要。把它传进去。尽量保持你的代码解耦:一个模块不应该依赖另一个模块的内部工作。相反,尽量少暴露。这样一来,您就可以保护自己,避免每次您想让事情表现得有点不同时都不得不改变世界。

    ma​​in.py

    import irc
    var = 1
    func(var)
    

    irc.py

    def func(var):
        print var
    

    【讨论】:

    • 将这个函数移动到主文件而不是添加这个参数对我来说会更容易
    • @gr56:那么听起来重构是有序的。如果这也不可能,我会使用您的第三个模块的解决方案,该模块仅包含 var 对象并由两者导入。如果这对您有用,请将其发布为您自己问题的答案并接受它。
    • @SamirTalwar 您可以对函数执行此操作,对于类的实例化呢?例如,您想在可以导入的另一个模块中定义一个类的实例。在这种情况下,参数不能是占位符。
    • 只有在我之前执行irc.py(运行脚本)时它才对我有用。我使用 Python 3 和 Spyder。如果没有,我会得到名称 func 未定义。
    【解决方案2】:

    嗯,这是我的代码,可以正常工作:

    func.py:

    import __main__
    def func():
        print(__main__.var)
    

    main.py:

    from func import func
    
    var="It works!"
    func()
    var="Now it changes!"
    func()
    

    【讨论】:

    【解决方案3】:

    两个选项。

    from main import var
    
    def func():
        print var
    

    这会将原始名称的引用复制到导入模块。

    import main
    
    def func():
        print main.var
    

    这将允许您使用来自其他模块的变量,并允许您根据需要更改它。

    【讨论】:

    • 哦,这是错误的。相互导入给了我heebie jeebies。
    • 那你就是不知道自己在做什么。相互导入是完全安全的,并且在某些非常明确的限制下可以正常工作。
    • @Ignacio:他们会在这个旨在突出问题的玩具代码中正常工作。我怀疑它们是否会在实际中按预期工作。即使他们这样做了,他们也会鼓励模块之间的模糊界限,这只会使添加新功能和维护旧功能变得更加困难。我无法想象相互导入比服务于原始两个模块的第三个模块更好的情况。
    • 这对我来说是最好的选择,但它给了我一个错误:AttributeError: 'module' object has no attribute 'func'
    • @gr56: 应该是__main__ 而不是main
    【解决方案4】:

    好吧,函数中的 var 没有被声明。您可以将其作为参数传递。 main.py

    import irc
    var = 1
    func(var)
    

    irc.py

    def func(str):
        print str
    

    【讨论】:

      【解决方案5】:

      Samir 所说的适用于 Python 2

      对于 python 3,你需要这样做。

      main.py

      import irc
      from irc import func
      
      var = 1
      func(var)
      irc.py
      

      irc.py

      def func(var):
          print(var)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多