Python &引用;组织投入”;打断脚本,发生了什么事?
一位同事向我发送了一个脚本,开头如下:Python &引用;组织投入”;打断脚本,发生了什么事?,python,python-import,Python,Python Import,一位同事向我发送了一个脚本,开头如下: from ourlibA import * from ourlibB import * import random import time from datetime import datetime print datetime.now() 当我这样调用脚本时,它工作得很好 但我使用的是pycharm,在做了一些编辑之后,我还使用了它的“组织导入”功能,将导入变成: import random import time from datetime imp
from ourlibA import *
from ourlibB import *
import random
import time
from datetime import datetime
print datetime.now()
当我这样调用脚本时,它工作得很好
但我使用的是pycharm,在做了一些编辑之后,我还使用了它的“组织导入”功能,将导入变成:
import random
import time
from datetime import datetime
from ourlibA import *
from ourlibB import *
print datetime.now()
现在,当我运行更改后的脚本时,我的结果是:
打印datetime.now()
AttributeError:“模块”对象没有“现在”属性
现在我很困惑,并提出了以下问题:
- 这里到底发生了什么?
的导入仍然存在,那么错误来自哪里datetime
- 显然,问题一定是因为第二个示例最后导入了我们自己的库,而不是第一个。但我怎样才能确切地找出我们图书馆的哪一部分导致了这种情况呢
import datetime
因此:当最后导入该库时,它与前面的from datetime import datetime
语句冲突
通过更改客户端脚本,两个“快速解决方案”(更多:肮脏的黑客)起作用:
- 从datetime导入datetime中删除
- 改用“完整路径”打印datetime.datetime.now()
“更好”的解决方案是:退一步,从X import*通配符语句中去掉
。识别所需的所有特定名称需要一点时间,但这绝对值得花时间 也许,在ourlibA
或ourlibB
中,有某种导入,比如import datetime
?或将X作为日期时间导入
?因为这会导致它在导入datetime的新名称时覆盖以前的导入,这是模块datetime
,而不是第一次导入的datetime.datetime
,这正是我在我的文档中写的。请注意,通常从X import*
执行是一种不好的做法,原因之一就是-它会导致导入之间的混淆和冲突,通常您只从ourlibA import X、Y、Z
等导入所需的(当然,还有导入*的用例),这样就解决了冲突问题,您也可以相应地命名导入(从ourlibA import X中命名为ourlibA_X
),在这种情况下,您可能希望将星号导入放在第一位,仅放在您自己文件的导入之后,而不是使用PyCharm的功能good自动组织它们,这样更好更清晰。我绝对不会使用它,总是显式的更好(有时导入模块本身并访问outlibA.X()
等等。我认为你的问题很好,解释得也很好。我猜如果很多人发现自己处于同样的情况而没有寻求帮助,他们会投赞成票。非常感谢你的帮助。我还更新了答案,以反映关于取消通配符导入的部分。