有不少人在写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 datetime from bug import anyfunc anyfunc() print(datetime.datetime.now())
此时,你会发现一切正常。如下图所示。
好了,我们来挖个坑,再次修改 main.py
,改成下面这样:
import datetime from 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 datetime datetime.datetime.now() datetime.date.today()
有些人喜欢
from datetime import datetime, date, timedelta datetime.now() date.today()
如果再遇上一个人喜欢 fromxxximport*
那么恭喜你——卒。
珍爱生命,请禁止使用 fromxxximport*
这种写法。