摘要:引子考慮有如下代碼結(jié)構(gòu)情況其余文件為空。分析情況當(dāng)我們運(yùn)行時,這時候系統(tǒng)的搜素路徑包括,我們可以通過在中添加證實(shí)這一點(diǎn)。情況情況其實(shí)和情況很不一樣,情況叫做,也就是包內(nèi)間接引用。顧名思義,這種引用方法只能在包內(nèi)使用。都是,但不一定是。
引子
考慮有如下代碼結(jié)構(gòu)
. ├── cat │?? ├── __init__.py │?? ├── cat.py │?? └── moo.py └── dog ├── __init__.py └── dog.py 2 directories, 5 files
情況1:
# ./cat/cat.py import moo
其余文件為空。如果我們用運(yùn)行命令: python cat/cat.py,則程序正常運(yùn)行;如果運(yùn)行命令;python -m cat.cat,則會報(bào)錯;
情況2:
# ./cat/cat.py from . import moo
則運(yùn)行結(jié)果相反。
其實(shí),我們的問題早就有人提出過了。PEP 395
The fact that most methods of invoking Python code from the command line break when that code is inside a package, and the two that do work are highly sensitive to the current working directory is all thoroughly confusing for a beginner. :如果一段代碼在一個包內(nèi),那么從命令行使用這段代碼是非常非常容易出錯的,只有2種方法可行:
在整個包的外部,python -c "from module import code,
在整個包的外部,通過-m參數(shù)執(zhí)行。
如果在包內(nèi)部,即使你的代碼正確,也基本會出錯。
分析情況1:
當(dāng)我們運(yùn)行python cat/cat.py時,這時候系統(tǒng)的搜素路徑包括./cat/,我們可以通過在./cat/cat.py中添加import sys; print(sys.path)證實(shí)這一點(diǎn)。
當(dāng)我們運(yùn)行 python -m cat.cat時,系統(tǒng)的搜索路徑只包括.,也就是當(dāng)前文件夾,我們可以通過在當(dāng)前文件夾下添加一個moo.py文件,這樣python -m cat.cat就不會報(bào)錯了??梢?,這時的搜索空間,不包括自文件夾。
情況2:
情況2其實(shí)和情況1很不一樣,情況2叫做package relative import,也就是包內(nèi)間接引用。顧名思義,這種引用方法只能在包內(nèi)使用。也就是說,只能通過python -m cat.cat, 或者是python -c "from cat import cat" 之類的方法來使用。以下內(nèi)容源自python官方文檔中的 The import statement
When a module or package is contained within another package ... using leading dots in the specified module or package after from you can specify how high to traverse up the current package hierarchy without specifying exact names.
官方文檔中的Package Relative Import 展示了詳細(xì)的用法。
importpython中,載入一個包有幾種方式:
import語句
importlib模塊提供的方法
內(nèi)置方法__import__ (不提倡)
python中,有module,有package。package都是module, 但module不一定是package。module只有一種,package有2種。
代碼重載:importlib.reload使用importlib.reload會重載當(dāng)前代碼。
import os import importlib import foo print("foo.a: {}".format(foo.a)) command = "echo a=2 >> foo.py" print(command) os.popen(command) importlib.reload(foo) print("foo.a: {}".format(foo.a))
輸出:
foo.a: 2 echo a=2 >> foo.py foo.a: 2參考資料
import 語法
PEP 395
PEP 420
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/45222.html
摘要:準(zhǔn)備工作初探,這個文章屬于自己的一個總結(jié)。所以教程面向新手,無技術(shù)含量。凡是報(bào)錯信息看到,就是表示縮進(jìn)不一致。注由于原網(wǎng)址不方便公布,代碼中的網(wǎng)址全部替換為了。 準(zhǔn)備工作 初探python,這個文章屬于自己的一個總結(jié)。所以教程面向新手,無技術(shù)含量。python環(huán)境Linux基本都有,Windows下官網(wǎng)也提供了便利的安裝包,怎么安裝配置網(wǎng)上有很多教程在此就不一一說明。我使用的pytho...
摘要:從導(dǎo)入相應(yīng)函數(shù),即傳入一個上一步中的類,返回對應(yīng)的網(wǎng)頁內(nèi)容,具體實(shí)現(xiàn)將在后續(xù)講解。后續(xù)只要去處理解析請求和響應(yīng)部分即可,主程序可以不用再修改。下一篇文章編程解析請求頭 Flask或者其他框架都是封裝的比較完善,我們可以不去關(guān)注路由、SESSION等到底是怎么實(shí)現(xiàn)的,現(xiàn)在我們使用socket來實(shí)現(xiàn)一個帶有注冊、登錄功能的To do網(wǎng)站,這樣能對后端框架了解的稍微更深入一點(diǎn)(當(dāng)然你也可以直...
摘要:以我們的程序?yàn)槔?,就是以為產(chǎn)生了一個名為的新類型,改類型的實(shí)現(xiàn)由給出,而就包含了通過返回的這個方法。從中找到這些類并一一執(zhí)行測試。 先以一個大牛的一段關(guān)于Python Metapgramming的著名的話來做開頭: Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder ...
摘要:今天要分享的是,用來寫。數(shù)據(jù)處理環(huán)節(jié)效率低下,易受干擾。問題排查難以溯源。一旦數(shù)據(jù)報(bào)告有誤,想要定位問題所在,常常需要從頭開始復(fù)盤。結(jié)果和上面結(jié)果結(jié)構(gòu)是一致的。這是官網(wǎng)的文檔,但是卻不完全適用目前的場景。 大毛 豈安科技業(yè)務(wù)風(fēng)險(xiǎn)分析師 多年訂單業(yè)務(wù)反欺詐經(jīng)驗(yàn),負(fù)責(zé)豈安科技多款產(chǎn)品運(yùn)營工作。 上回筆者分享過一些 pandas 的常用數(shù)據(jù)查詢語法,但是數(shù)據(jù)查詢對于 pandas 而言只是冰...
閱讀 4069·2021-11-16 11:44
閱讀 5326·2021-10-09 09:54
閱讀 2076·2019-08-30 15:44
閱讀 1753·2019-08-29 17:22
閱讀 2828·2019-08-29 14:11
閱讀 3455·2019-08-26 13:25
閱讀 2386·2019-08-26 11:55
閱讀 1679·2019-08-26 10:37