1. 程式人生 > >Python30 動態導入模塊/斷言

Python30 動態導入模塊/斷言

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 動態導入模塊/斷言