如何在Python脚本中为导入的类获取相同的范围?

时间:2015-11-18 21:21:36

标签: python python-2.7 scope python-import global-scope

脚本中定义的类似乎与导入脚本的类具有不同的范围。例如:

在文件foo.py中:

class foo(object):
    def __init__(self):
        print globals()

在我的主文件中:

from foo import foo

class bar(object):
    def __init__(self):
        print globals()

classimport = foo()
classinternal = bar()

从foo和bar返回的全局变量列表是不同的 - 这是为什么?

由于任何需要访问主globals()的类都必须驻留在主文件中,这使生活变得困难。如何确保导入的类具有相同的全局范围?我在阅读其他帖子herehere后尝试过的一些内容包括:

module = __import__("foo", fromlist="foo")
globals()["foo"] = getattr(module, "foo")

__builtin__.foo = foo

任何帮助表示赞赏!

[编辑] ---

因此,根据上面的链接,我会在duplicate article中回答这个问题。事实证明,范围不是跨模块共享的。它提到了几种方法,但在我的情况下,我需要实际创建/读/写全局变量。所以我在主脚本中创建了一个例程,并在初始化foo和bar时将其作为对象传递。例如:

def PrintGlobals():
    print globals()

class bar(object):
    def __init__(self, PrintGlobals):
        self.PrintGlobals = PrintGlobals
        self.PrintGlobals()

classinternal = bar(PrintGlobals)

(不是我选择了所有这些应该如何工作,它是一个黑客攻击,直到我得到应用程序开发人员的时间: - )

1 个答案:

答案 0 :(得分:2)

以下是Python 3 FAQ所说的内容:

  

在Python中,仅在函数内引用的变量是隐式全局变量。如果在函数体内的任何位置为变量赋值,则除非明确声明为全局,否则将其视为局部值。

     

虽然起初有点令人惊讶,但片刻的考虑解释了这一点。一方面,要求指定变量的全局性可以防止意外的副作用。另一方面,如果所有全局引用都需要全局,那么您将一直使用全局。您必须将对内置函数或导入模块的组件的每个引用声明为全局。这种混乱会破坏全球声明识别副作用的有用性。

要查看各种范围内的全局变量,请尝试在执行期间的各个点执行打印(globals())。例如:在运行任何代码之前的顶级模块中,然后在__init__.py中,如果你有任何代码(因为你导入foo),在foo的模块级别,在每个函数内,在你之前/之后修改传递给函数的任何变量。

This answer进一步解释:

  

我认为你在这里缺少的关键是每个模块都有自己的“全局”命名空间。起初这可能有点令人困惑,因为在像C这样的语言中,所有外部变量和函数共享一个全局命名空间。但是一旦你超越了这个假设,Python的方式就变得非常有意义了。

但请注意,在程序包名称空间中导入程序包或程序包中的模块时,程序包__init__.py文件中分配的所有名称都可用。