一日一技:如何在Python项目中挖坑害人
有不少人在写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*这种写法。