代码之家  ›  专栏  ›  技术社区  ›  Frzzy

全局函数,从不同文件调用的变量

  •  1
  • Frzzy  · 技术社区  · 6 年前

    我有两个不同的文件: 一个来自CI构建: 生成.py

    ABC_ACTIVATE = False
    def activate_abc():
        global ABC_ACTIVATE
        ABC_ACTIVATE = True
        # Maybe some more very long code.
    

    一个来自定制 自定义.py

    from build import *
    
    activate_abc()
    print ABC_ACTIVATE
    

    其思想是通过一个函数而不是很长的代码为每个环境定制激活。但从那以后就没用了 ABC_ACTIVATE 总是 False .

    全局变量似乎无法在另一个文件中接收相同的上下文。潜在的一些“周期依赖”问题。

    所以我的问题是:有没有更好的结构解决方案?这个想法仍然由函数激活,customize.py将是apache构建的最后一个设置。

    3 回复  |  直到 6 年前
        1
  •  1
  •   scharette    6 年前

    全局似乎无法在其他文件中接收相同的上下文。可能是一些“周期依赖”问题。

    一旦你进口了它, ABC_ACTIVATE 在该脚本的上下文中变为本地。因此,在 build.py 不会反映在其他模块中。

    所以我的问题是:有没有更好的结构解决方案?

    您可以创建一个中介方法来返回 激活ABC 布尔值 生成.py .

    def is_abc_activated():
        return ABC_ACTIVATE
    

    然后像这样导入,

    from build import activate_abc, is_abc_activated
    
    print(is_abc_activated())
    activate_abc()
    print(is_abc_activated())
    
    >>>>
    False
    True
    

    基本上,这将删除您的无条件导入 from build import * 这是Python中的一个反习语。此外,它将增加可读性,因为访问 激活ABC 可能会让你搞不清你到底在做什么。

        2
  •  0
  •   Frzzy    6 年前

    经过一番讨论,我的朋友找到了一个很好的解决办法:

    build.py版本:

    ABC_ACTIVATE = False
    def activate_abc(other_context):
        other_context.ABC_ACTIVATE = True
    

    在customize.py中:

    from build import *
    activate_abc(sys.modules[__name__])
    print ABC_ACTIVATE
    

    现在可以了。

        3
  •  -1
  •   N Chauhan Nathan Hinchey    6 年前

    这看起来像build.py中函数定义的不正确语法:第一个{应该是a:而第二个}不需要,因为python使用缩进来表示代码块

    ACTIVATE = False
    def activate():
        global ACTIVATE
        ACTIVATE = True
    

    也许你也可以。。。

    import build
    build.activate() 
    

    …就像build.py中的脚本使用同一个文件中的变量,而导入的变量由于导入到当前文件的命名空间而不同。