Python中是否存在超级全局(如PHP)?我想在整个项目中使用某些变量,在单独的文件,类和函数中使用,我不想在每个文件中继续声明它。
答案 0 :(得分:19)
理论上,是的,你可以开始将__builtin __:
喷出来>>> import __builtin__
>>> __builtin__.rubbish= 3
>>> rubbish
3
但是,不要这样做;这可怕的邪恶将使你的应用程序编程 - 癌症。
类和函数,我不想继续声明
将它们放入模块中,并在需要使用它们时“导入”它们。
我想在整个项目中使用某些变量
如果你必须有非限定值,只需将它们放在一个名为“mypackage / constants.py”的文件中,然后:
from mypackage.constants import *
如果它们确实是'变量',你在应用程序执行期间更改它们,则需要开始将它们封装在对象中。
答案 1 :(得分:4)
即使有,也不应该使用这样的构造EVER。考虑使用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的模块或类是什么。
答案 2 :(得分:4)
命名空间是一个非常好的主意,它们是必不可少的 - php没有适当的命名空间,而且它是一团糟。
从概念上讲,编写应用程序的一部分在于定义一个合适的词汇表,这些词汇将用于执行您想要的事情。然而在经典的方式中,正是这些词语并不容易,因为你必须首先导入它,导入它以获得访问权限。当命名空间成为javascript社区的焦点时,jquery fame的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
或者某些人会这样做正确。然而,几乎没有人这样做。
我肯定会对这些观点引起一些激烈的评论,所以请继续。
答案 3 :(得分:3)
创建空的superglobal.py模块。
在您的文件中执行:
import superglobal
superglobal.whatever = loacalWhatever
other = superglobal.other
答案 4 :(得分:1)
对你来说不明显的原因是Python故意不试图支持这样的事情。命名空间是功能,使用它们对您有利。如果您想要在另一个文件中定义的内容,请将其导入。这意味着从阅读源代码可以了解所有内容的来源,并使代码更易于测试和修改。