Python 跨模块变量

Python 跨模块变量,python,import,module,Python,Import,Module,从中我了解了如何使用其他模块中的变量。这一切都很好用 import foo as bar 但我不想导入我的模块作为酒吧,我想使用它没有任何前缀像 from foo import * 使用这种方法,不可能修改来自其他模块的变量。读书会有用的!有什么想法吗?建议 通过使用import foo from bar,您不会将bar作为变量导入,而是作为常量导入。通过使用import foo from bar,您不会将bar作为变量导入,而是作为常量导入。据我所知,无法从模块导入值并使其在导入范围内可读

从中我了解了如何使用其他模块中的变量。这一切都很好用

import foo as bar
但我不想导入我的模块作为酒吧,我想使用它没有任何前缀像

from foo import *

使用这种方法,不可能修改来自其他模块的变量。读书会有用的!有什么想法吗?建议

通过使用import foo from bar,您不会将bar作为变量导入,而是作为常量导入。

通过使用import foo from bar,您不会将bar作为变量导入,而是作为常量导入。

据我所知,无法从模块导入值并使其在导入范围内可读写。在Python中导入foo时,它会创建一个名为foo的模块对象。获取和设置模块对象上的属性将在模块范围内更改它们。但是当您从foo导入一些东西时,foo被导入并创建一个模块对象,但不会返回。相反,Python将您指定的值从foo中复制出来,并将它们放入本地范围。如果要导入的是int或str之类的不可变类型,则不可能对其进行更改并使更改反映在foo模块中。与此类似:

>>> class N(object):
...   def __init__(self, value):
...     self.value = value
>>> n = N(3)
>>> value = n.value
>>> print value, n.value
3 3
>>> value = 4
>>> print value, n.value
4 3

除了粗糙的黑客,如果你真的想修改模块的变量,你需要导入模块本身并修改模块上的变量。但一般来说,必须这样做表明设计不好。如果您是所讨论的foo模块的编写者,您可能希望看看其他更具python风格的方法来解决您的问题。

据我所知,无法从模块导入值并使其在导入范围内可读写。在Python中导入foo时,它会创建一个名为foo的模块对象。获取和设置模块对象上的属性将在模块范围内更改它们。但是当您从foo导入一些东西时,foo被导入并创建一个模块对象,但不会返回。相反,Python将您指定的值从foo中复制出来,并将它们放入本地范围。如果要导入的是int或str之类的不可变类型,则不可能对其进行更改并使更改反映在foo模块中。与此类似:

>>> class N(object):
...   def __init__(self, value):
...     self.value = value
>>> n = N(3)
>>> value = n.value
>>> print value, n.value
3 3
>>> value = 4
>>> print value, n.value
4 3
除了粗糙的黑客,如果你真的想修改模块的变量,你需要导入模块本身并修改模块上的变量。但一般来说,必须这样做表明设计不好。如果您是所讨论的foo模块的作者,您可能想看看其他更具python风格的方法来解决您的问题。

来自foo import*被我、被、被——您应该看到,因为它最好地解释了为什么这是不好的——但不幸的是,不是被。-这使得代码无法读取

考虑:

from foo import *
from bar import *
from baz import *

dostuff()
如果您在运行dostuff时出错,您会在哪里查找问题?它可能来自这些进口品中的任何一种

对于可读的、可维护的代码,请坚持使用from foo import bar。对于可读的、模块化的、可维护的代码,不要使用globals-如果您不能更改上游源代码以公开修改您需要访问的值的方法,请通过子类化来扩展bar。

来自foo import*的受到我、by、by的反对-您应该看到,因为它最好地解释了为什么这是不好的-但是,不幸的是这使得代码无法读取

考虑:

from foo import *
from bar import *
from baz import *

dostuff()
如果您在运行dostuff时出错,您会在哪里查找问题?它可能来自这些进口品中的任何一种


对于可读的、可维护的代码,请坚持使用from foo import bar。对于可读的、模块化的、可维护的代码,如果您无法更改上游源代码以公开修改需要访问的值的方法,请不要使用globals-通过子类化扩展bar。

简短回答:不,这是不可能的,您必须使用前缀

重要的是要理解,从foo导入x,y将x复制到您的命名空间。这相当于:

import foo
# COPY TO YOUR NAMESPACE
x = foo.x
y = foo.y
# `from foo import` does NOT leave `foo` in your namespace
def foo
这样,每个模块将获得x和y的本地副本。在其他模块中看不到更改x,您也看不到其他模块所做的更改:-

要更改变量的中心副本,必须导入模块本身:import foo和change foo.x。这样,只有一个副本存在,每个人都在访问它:-

[链接问题还提到了将共享变量放入模块内置中的可能性。不要这样做!这将消除用于读取的前缀,而不是用于写入的前缀,这是非常糟糕的风格。]

为Python辩护的一个注记 如果你讨厌使用foo。前缀在这里,你可能也会怨恨对自我的需要。访问对象变量的前缀。底线是Python就是这样工作的——因为您不声明变量,所以除了使用前缀之外别无选择

但也有一个好处:在阅读Python代码时,您很容易看到每个变量所在的位置。我想那很好

支持证据:使用其他语言,如C++/J ava,许多人遵守惯例,如在所有对象变量名上使用m_u前缀,以实现类似的效果

风格评论 您不需要将foo导入为bar,只需使用importfoo即可。 由于表单没有做任何新的事情,它只是重命名了它,这让人很困惑。 只有当foo是一个很长的名字时,它才有用;一个特别被接受的情况是,当foo深入某个包时,您可以将long.package.foo作为foo导入

from foo import*在程序中被认为是非常糟糕的样式,因为:

读你代码的人不知道名字是从哪里来的

它污染了您的名称空间,当名称来自 不同的模块冲突

foo import x,y中的显式表单是可以的,但是如果您使用模块中的许多名称,就会出现同样的问题。 在这种情况下,最好导入foo并显式编写foo.x、foo.y

底线:当有疑问时,一个简单的导入foo是最好的


例外:在交互式解释器上进行实验时,使用import*非常方便。但是请注意,它不能很好地处理重载,所以在调试更改的代码时不要使用它。要调试您正在编写的模块,最好在模块的名称空间内启动一个新的解释器,即python-i mymodule.py/F5,以空闲状态运行。

简短回答:不,这是不可能的,您必须使用前缀

重要的是要理解,从foo导入x,y将x复制到您的命名空间。这相当于:

import foo
# COPY TO YOUR NAMESPACE
x = foo.x
y = foo.y
# `from foo import` does NOT leave `foo` in your namespace
def foo
这样,每个模块将获得x和y的本地副本。在其他模块中看不到更改x,您也看不到其他模块所做的更改:-

要更改变量的中心副本,必须导入模块本身:import foo和change foo.x。这样,只有一个副本存在,每个人都在访问它:-

[链接问题还提到了将共享变量放入模块内置中的可能性。不要这样做!这将消除用于读取的前缀,而不是用于写入的前缀,这是非常糟糕的风格。]

为Python辩护的一个注记 如果你讨厌使用foo。前缀在这里,你可能也会怨恨对自我的需要。访问对象变量的前缀。底线是Python就是这样工作的——因为您不声明变量,所以除了使用前缀之外别无选择

但也有一个好处:在阅读Python代码时,您很容易看到每个变量所在的位置。我想那很好

支持证据:在其他语言(如C++/Java)中,许多人遵守约定,如在所有对象变量名上使用m_u前缀,以实现类似的效果

风格评论 您不需要将foo导入为bar,只需使用importfoo即可。 由于表单没有做任何新的事情,它只是重命名了它,这让人很困惑。 只有当foo是一个很长的名字时,它才有用;一个特别被接受的情况是,当foo深入某个包时,您可以将long.package.foo作为foo导入

from foo import*在程序中被认为是非常糟糕的样式,因为:

读你代码的人不知道名字是从哪里来的

它污染了您的名称空间,当名称来自 不同的模块冲突

foo import x,y中的显式表单是可以的,但是如果您使用模块中的许多名称,就会出现同样的问题。 在这种情况下,最好导入foo并显式编写foo.x、foo.y

底线:当有疑问时,一个简单的导入foo是最好的


例外:在交互式解释器上进行实验时,使用import*非常方便。但是请注意,它不能很好地处理重载,所以在调试更改的代码时不要使用它。要调试您正在编写的模块,最好在模块的名称空间内启动一个新的解释器,即python-i mymodule.py/F5,并将其闲置。

related:related:无法修改其他模块的变量意味着什么?您正在尝试更新磁盘上其他模块的源文件吗?您只是试图访问模块全局变量吗?你想做什么?相关:相关:不可能修改其他模块的变量意味着什么?您正在尝试更新磁盘上其他模块的源文件吗?您只是试图访问模块全局变量吗?你想干什么?