前言
在編程開發中,個人覺得,只要按照規范去做,很少會出問題。剛開始學習一門技術時,的確會遇到很多的坑。踩的坑多了,這是好事,會學到更多東西,也會越來越覺得按照規范做的重要性,規范的制定就是用來規避問題的。有時候確實應該聽聽有經驗人的建議,不要一意孤行。這好像不是本文的重點,其實我重點是想表達,盡量按規范做事,這樣會少走很多彎路。
我現在使用的主力編程語言是 Python,在接觸 Python 至今,我感覺我踩的坑還是極少的,基本上沒有遇到什么奇怪的問題。實際上,這并不是一件好事,不踩坑,很多躺在暗處的知識點你不會了解,所以也很難成長。幸好,有一些會踩坑的同事。
一同事問我,在 Python 中,如果一個模塊和一個包同名時,是不是只能導入包,如果要導入模塊該怎么辦。他的意思大概是這樣的,在項目的同一級目錄下,有一個 foo.py 文件和一個 foo/ 目錄,如果 import foo 會導入 foo/ 的內容而不是 foo.py 的內容。
被問到這個問題時,我首先感覺到的是詫異,這明顯是存在歧義的。如果是我,肯定不會把模塊名和包名設計成一樣的名字,因為本質上來說在導入的時候沒法區分到底要導入誰。除非系統有特別的規定,例如,規定這種情況只能導入包。
我的潛意識里認為這里應該報錯,Python 解釋器不知道要導入誰。但是,同事告訴我,別人的代碼是這么寫的,而且在這種情況下會默認導入包。那就是可以的咯,而且解釋器已經規定這種情況會總是導入包。
為了驗證下這一點,我寫了個簡單的項目,項目結構如下:
.├── main.py└── same ├── api │ └── __init__.py ├── auth │ └── __init__.py ├── auth.py └── __init__.py
其中:
same/api/__init__/py 的內容:
from .. import auth
same/auth/__init__.py 的內容:
auth_str = "This is str in package!"
same/auth.py 的內容:
auth_str = "This is str in module!"
main.py 的內容:
from __future__ import print_functionfrom same.api import auth# Script starts from hereif __name__ == "__main__": print(auth.auth_str)
稍微有些復雜,哈哈,主要是同事那兒大致的結構是這樣的,這里是為更好的模擬下。我在 same.auth 包中定義了一個 auth_str 字符串,又在同名的 same.auth 模塊中定義了一個同名的 auth_str 字符串,然后在 same.api 包嘗試導入 auth,最后在 main.py 嘗試輸出 same.api.auth.auth_str,看看到底哪個字符串會被打印。同時嘗試用 Python2 和 Python3 執行 main.py,得到的結果都是:            
新聞熱點
疑難解答