Python30 動態導入模塊/斷言
阿新 • • 發佈:2018-03-15
python動態導入模塊
方式1(解釋器調用)
根據當前目錄結構進行動態導入模塊設置
#在A1.py中
from code1 import aa #使用該方式就可以導入aa這個模塊
#在A1.py中
modname = ‘aa‘
from code1 import modname
#如果通過導入字符串的方式,來導入模塊就會報錯,因為modname = ‘aa‘,只是一個字符串形式,不是一個模塊
#在A1.py中 mod1 = __import__(‘code1‘) #當前只導入了code1這個路徑 mod2 = __import__(‘code1.aa‘) #這裏雖然寫的是‘code1.aa‘,但是導入的也只是code1這個路徑 print (mod1) print (mod2) 執行結果: <module ‘code1‘ from ‘E:\\python\\代碼練習\\code1\\__init__.py‘> <module ‘code1‘ from ‘E:\\python\\代碼練習\\code1\\__init__.py‘> #當前結果我們看到的雖然一樣,但實際是有區別的; mod1 = __import__(‘code1‘) #當前只導入了code1這個路徑 mod2 = __import__(‘code1.aa‘) #這裏雖然寫的是‘code1.aa‘,但是導入的只是code1這個路徑 print (mod1.aa) print (mod2.aa) 執行結果: <module ‘code1.aa‘ from ‘E:\\python\\代碼練習\\code1\\aa.py‘> <module ‘code1.aa‘ from ‘E:\\python\\代碼練習\\code1\\aa.py‘> #在這裏可能認為我們定義變量的時候(mod2 = __import__(‘code1.aa‘)),是否加後面的‘.aa‘都是可以的,但請看下面的代碼 #將mod2註釋掉 mod1 = __import__(‘code1‘) print (mod1.aa) 執行結果: Traceback (most recent call last): File "E:/python/代碼練習/A1.py", line 4, in <module> print (mod1.aa) AttributeError: module ‘code1‘ has no attribute ‘aa‘ #可以看到單獨的mod1是沒有定義後面的‘.aa‘,所以這裏無法調用mod1.aa; 上面的代碼能調用那是因為mod2中已經定義了‘.aa‘,所以mod1才可以調用的。 #將mod1註釋掉 mod2 = __import__(‘code1.aa‘) print (mod2) print (mod2.aa) 執行結果: <module ‘code1‘ from ‘E:\\python\\代碼練習\\code1\\__init__.py‘> <module ‘code1.aa‘ from ‘E:\\python\\代碼練習\\code1\\aa.py‘> #執行結果說明了當定義了,假如只定義了2層路徑時,第1層和第2層路徑都是可以訪問的,但是如果只定義了1層路徑時,第2層路徑是不能訪問的(因為根本就不知道第2層路徑的內容)。
#在aa.py中
class C:
def __init__(self):
self.name = ‘zhangsan‘
#在A1.py中
mod1 = __import__(‘code1.aa‘)
#這裏雖然都是字符串格式,但卻是可以通過__import__方式動態導入的
obj = mod1.aa.C() #對aa.py中的class C生成一個實例
print (obj.name)
執行結果:
zhangsan
方式2
官方建議使用方式2來動態導入模塊
import importlib #內置模塊 aa = importlib.import_module(‘code1.aa‘) print (aa.C().name)
斷言
斷言可以判斷是否為真
obj = ‘zhangsan‘
assert type(obj) is str
#通過type(obj)來判斷obj是一個字符串;為真的話,就繼續向下執行代碼。
print (‘testtest‘)
執行結果:
testtest
obj = ‘zhangsan‘ assert type(obj) is int #斷言obj為整數 print (‘testtest‘) 執行結果: Traceback (most recent call last): File "E:/python/代碼練習/A2.py", line 4, in <module> assert type(obj) is int AssertionError #斷言錯誤,就不會向下執行代碼
當後面的代碼完全依賴前面的條件時,就可以使用斷言;
比如判斷一個變量為整數後,才對這個變量(整數)進行加減乘除的計算,否則就報錯。
或者判斷銀行轉賬之前,得確認余額足夠,然後才會去執行轉賬動作。
斷言與if類似,不過斷言會進行報錯來提示。
Python30 動態導入模塊/斷言