有不少人在写Python的时候,喜欢这样导入模块:
from re import *
text = 'adfa123adfasd'
num = findall('(\d+)', text)
print(num)
我今天要告诉你,你这样写就是在给自己挖坑。
我们来看一下这个坑是怎么样的:
首先你创建一个 main.py
文件,内容如下:
import datetime
print(datetime.datetime.now())
现在我们运行一下,发现一切正常。
接下来,创建一个 bug.py
,内容如下:
from datetime import datetime
def anyfunc(): print(123)
接下来,修改 main.py
,内容如下:
import datetimefrom bug import anyfunc
anyfunc()print(datetime.datetime.now())
此时,你会发现一切正常。如下图所示。
好了,我们来挖个坑,再次修改 main.py
,改成下面这样:
import datetimefrom bug import *
anyfunc()print(datetime.datetime.now())
现在,函数 anyfunc
正常运行,但是你会发现, datetime.datetime.now()
报错了,如下图所示。
这是因为,当你 frombugimport*
的时候,原来在 bug.py
第一行的 fromdatetimeimportdatetime
导入的 datetime.datetime
对象也会被导入到 main.py
中,此时由于 datetime.datetime
对象和 datetime
模块的名字相同,就会使得 datetime.datetime
对象覆盖了原来的 datetime
模块。所以就报错了。
由于一个大项目很多人合作,可能有些人喜欢
import datetimedatetime.datetime.now()datetime.date.today()
有些人喜欢
from datetime import datetime, date, timedelta
datetime.now()date.today()
如果再遇上一个人喜欢 fromxxximport*
那么恭喜你——卒。
珍爱生命,请禁止使用 fromxxximport*
这种写法。