gpt4 book ai didi

python - 为什么是: Python 'Import x' then Re- 'import x as y' clobbers import of x?

转载 作者:行者123 更新时间:2023-12-01 05:24:56 29 4
gpt4 key购买 nike

所以,我有一个关于 Python 导入的小谜团。我确信出于某种原因事情应该是这样的,因为 Guido 很少出错。但是,为什么会这样呢?

$ cat myModule.py
#!/usr/bin/python

class SomeModule(object):

def __init__(self):
print "in SomeModule.__init__ ! "

def doSomething(self):
print 'doing something.'

$ cat myTest.py
import unittest
from myModule import SomeModule

class TestMyModule(unittest.TestCase):

def test_001(self):
print "should see init below"
sm = SomeModule()
sm.doSomething()
print "should see init above\n"

def test_002(self):
print "should not see init below."
from myModule import SomeModule as SM2
SM2.__init__ = lambda x: None
sm2 = SM2()
sm2.doSomething()
print "should not have seen init above.\n"

def test_bbb(self):
print "Should see init below"
sm = SomeModule()
sm.doSomething()
print "should see init above\n"

$ nosetests myTest.py -s
should see init below
in SomeModule.__init__ !
doing something.

should see init above
.should not see init below.
doing something.
should not have seen init above.

.Should see init below
doing something.
should see init above
.
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

最终测试应该不会受到中间测试导入的影响,对吧?我的直觉告诉我不必担心初始导入,因为第二次导入使用“as”。 因此,在最后一次测试中,我希望看到 init,但没有。

显然,第二个导入,“from myModule import SomeModule as SM2”,破坏了 Some Module 的初始导入,尽管它看起来应该是一个完全独立的实体,如 SM2,而不是 SomeModule。

这对某人有意义吗?

最佳答案

这里的“问题”是 SM2SomeModule同一类。在 python 中,每个模块只有一个“实例” - 重新导入将返回对同一对象的引用:

>>> import code
>>> import code as code2
>>> code is code2
True

在您的代码中,当您运行 SM2.__init__ = lambda x: None 时,您将替换该类的构造函数。这会影响 SM2SomeModule 以及可能从 myModule 导入的任何其他代码

如果您只是使用 SM2= SomeModule 为该类添加别名,也会发生同样的情况。

当新程序员开始处理列表并期望分配给新变量来复制实际列表时,这也是让新程序员感到惊讶的机制:

>>> a=[1]
>>> b=a
>>> b.append(2)
>>> print a
[1, 2]

您可以使用 is 验证代码中对象的身份。请注意,这与平等不同:

>>> []==[]
True
>>> [] is []
False

关于python - 为什么是: Python 'Import x' then Re- 'import x as y' clobbers import of x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21558543/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com