4

Python中是否有超级全局(如PHP)?我有一些变量我想在我的整个项目中在单独的文件、类和函数中使用,我不想在每个文件中一直声明它。

4

5 回答 5

19

理论上是的,你可以开始向 __builtin__ 注入杂乱无章的东西:

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

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

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

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

我想在整个项目中使用某些变量

如果您必须有不合格的值,只需将它们放在一个名为“mypackage/constants.py”之类的文件中,然后:

from mypackage.constants import *

如果它们真的是“变量”,因为您在应用程序执行期间更改了它们,那么您需要开始将它们封装在对象中。

于 2009-04-10T00:35:38.160 回答
4

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

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 模式来创建一个单例对象。无论您在代码中的什么位置使用它,“myvalue”都将是相同的,无论您在哪个模块或类中实例化 Config。

于 2009-04-10T00:41:45.413 回答
4

创建空的 superglobal.py 模块。
在您的文件中执行以下操作:

import superglobal
superglobal.whatever = loacalWhatever
other = superglobal.other
于 2009-04-10T11:40:21.773 回答
4

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

命名空间是一个非常好的主意,它们是必不可少的——php没有适当的命名空间,而且一团糟。

从概念上讲,编写应用程序的一部分在于定义合适的词汇表,即您将用来做您想做的事情的词。然而在经典的方式中,正是这些词并不容易,因为你必须先导入这个,导入那个才能获得访问权限。

当命名空间成为 javascript 社区的焦点时,jquery 成名的 john resig 决定在全局命名空间中提供单个$变量是可行的方法:它只会最小地影响全局命名空间,并提供对 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或者某些这样的东西是正确的。然而,几乎没有人这样做。

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

于 2011-02-04T16:14:51.440 回答
1

它对您来说并不明显的原因是 Python 故意不尝试支持这样的事情。命名空间是一项功能,使用它们对您有利。如果您想要在另一个文件中定义的内容,请导入它。这意味着通过阅读您的源代码,您可以找出所有内容的来源,并且还可以使您的代码更容易测试和修改。

于 2011-02-04T13:43:41.853 回答