Python中是否有超级全局(如PHP)?我有一些变量我想在我的整个项目中在单独的文件、类和函数中使用,我不想在每个文件中一直声明它。
5 回答
理论上是的,你可以开始向 __builtin__ 注入杂乱无章的东西:
>>> import __builtin__
>>> __builtin__.rubbish= 3
>>> rubbish
3
但是,不要这样做;这是可怕的邪恶,会给你的应用程序编程癌症。
类和函数,我不想一直声明
将它们放入模块中,并在需要使用它们时“导入”它们。
我想在整个项目中使用某些变量
如果您必须有不合格的值,只需将它们放在一个名为“mypackage/constants.py”之类的文件中,然后:
from mypackage.constants import *
如果它们真的是“变量”,因为您在应用程序执行期间更改了它们,那么您需要开始将它们封装在对象中。
即使有,你也不应该使用这样的构造。考虑使用博格模式来保存这种东西。
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。
创建空的 superglobal.py 模块。
在您的文件中执行以下操作:
import superglobal
superglobal.whatever = loacalWhatever
other = superglobal.other
在多年的实践中,我对 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
或者某些这样的东西是正确的。然而,几乎没有人这样做。
我肯定会用这些观点引起一些激烈的评论,所以继续吧。
它对您来说并不明显的原因是 Python 故意不尝试支持这样的事情。命名空间是一项功能,使用它们对您有利。如果您想要在另一个文件中定义的内容,请导入它。这意味着通过阅读您的源代码,您可以找出所有内容的来源,并且还可以使您的代码更容易测试和修改。