代码之家  ›  专栏  ›  技术社区  ›  Shard Brian Ellis

python超级全局?

  •  4
  • Shard Brian Ellis  · 技术社区  · 15 年前

    在python中是否有一个超级全局(如php)?在整个项目中,我希望在单独的文件、类和函数中使用某些变量,并且不希望在每个文件中不断声明这些变量。

    5 回复  |  直到 13 年前
        1
  •  19
  •   bobince    15 年前

    理论上是的,你可以开始把积垢喷到内置的容器里:

    >>> import __builtin__
    >>> __builtin__.rubbish= 3
    >>> rubbish
    3
    

    但是,不要这样做;这是可怕的邪恶会给你的应用程序编程癌症。

    类和函数,我不想一直声明

    将它们放入模块中,并在需要使用时导入它们。

    我在整个项目中都有一些要使用的变量

    如果必须有不合格的值,只需将它们放入名为mypackage/constants.py的文件中,然后:

    from mypackage.constants import *
    

    如果它们确实是变量,在应用程序执行期间更改它们,则需要开始将它们封装到对象中。

        2
  •  4
  •   Shane C. Mason    15 年前

    即使有,也不应该使用这样的构造。考虑使用Borg模式来保存这种东西。

    class Config:
        """
        Borg singlton config object
        """
        __we_are_one = {}
        __myvalue = ""
    
        def __init__(self):
            #implement the borg patter (we are one)
            self.__dict__ = self.__we_are_one
    
        def myvalue(self, value=None):
            if value:
               self.__myvalue = value
            return self.__myvalue
    
    conf = Config()
    conf.myvalue("Hello")
    conf2 = Config()
    print conf2.myvalue()
    

    这里我们使用borg模式创建一个singlton对象。无论您在代码中的何处使用它,“myvalue”都是相同的,无论您在哪个模块或类中实例化config。

        3
  •  4
  •   flow    14 年前

    在多年的实践中,我对Python的导入系统感到非常失望:它很复杂,很难正确处理。此外,我必须在我编写的每个模块中维护大量的导入,这是一个PITA。

    名称空间是一个很好的主意,而且它们是必不可少的——PHP没有合适的名称空间,这是一个混乱的地方。

    从概念上讲,编写应用程序的一部分包括定义一个合适的词汇表,这些词汇表是用来完成您想要做的事情的。然而,在经典的方式中,正是这些单词不会变得容易,因为您必须首先导入它,然后导入它以获得访问权限。

    当名称空间在JavaScript社区中成为焦点时,jQueryFame的JohnResig决定提供一个 $ 全局命名空间中的变量是解决方法:它只会对全局命名空间产生最小的影响,并且通过jquery提供对所有内容的轻松访问。

    同样,我用一个全局变量进行了实验 g 在某种程度上起到了作用。基本上,这里有两个选项:要么有一个必须在应用程序中任何其他模块之前运行的启动模块,它定义了应用程序中应该提供哪些内容 G ,所以它可以在需要的时候使用。我尝试的另一种方法是 G 懒惰,在需要新名称时对自定义导入做出反应;因此每当需要 g.foo.frob(42) 这是第一次,这种机制会尝试 import foo; g.foo = foo 在幕后。这是相当困难做正确。

    这些天,除了标准的库和站点包,我几乎完全放弃了导入系统。大多数时候,我为软管库编写包装器,因为90%的库无论如何都有无意义的复杂接口。然后,我在全局命名空间中发布这些包装器,使用拼写约定将冲突风险降至最低。

    我这样说只是为了缓解这样一种印象,即修改全局名称空间本身就是一种邪恶的东西,而其他的答案似乎都在说明这一点。不是这样。邪恶的是不加考虑地去做,或者被语言或包装设计强迫去做。

    让我补充一句话,因为我几乎肯定会在这里受到一些攻击:99%的导入是由那些虔诚地维护名称空间纯度的人完成的 错误的 . 证明?你将阅读任何模块的开头几行 foo.py 这需要做一些三角函数,比如 from math import sin . 当你正确的时候 import foo 看看这个名称空间,你会发现什么?某物命名 foo.sin . 但那 sin 不是的接口的一部分 foo ,它只是一个助手,不应该使该命名空间混乱——因此, from math import sin as _sin 或者是一些正确的。然而,几乎没有人这样做。

    我肯定会用这些观点引起一些热烈的评论,所以继续说吧。

        4
  •  3
  •   vartec    15 年前

    创建空的superglobal.py模块。
    在您的文件中:

    import superglobal
    superglobal.whatever = loacalWhatever
    other = superglobal.other
    
        5
  •  1
  •   Mike Graham    14 年前

    你不明白的原因是,python故意不支持这样的东西。命名空间是 特征 使用它们对你有利。如果需要在另一个文件中定义的内容,请将其导入。这意味着,通过阅读源代码,您可以找出所有东西的来源,并使代码更易于测试和修改。