Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;组织投入”;打断脚本,发生了什么事?_Python_Python Import - Fatal编程技术网

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
    的导入仍然存在,那么错误来自哪里
  • 显然,问题一定是因为第二个示例最后导入了我们自己的库,而不是第一个。但我怎样才能确切地找出我们图书馆的哪一部分导致了这种情况呢
我知道这不是一个完整的mcve,但这些私人图书馆是巨大的,而且是私人的。我更想问的是如何在python中处理这样一个“导入顺序”问题

(我使用的是python 2.7.17)

我采用了一种“暴力”的方法,简单地手动检查私有库的导入语句(递归),以确定是否存在

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()
等等。我认为你的问题很好,解释得也很好。我猜如果很多人发现自己处于同样的情况而没有寻求帮助,他们会投赞成票。非常感谢你的帮助。我还更新了答案,以反映关于取消通配符导入的部分。