reflect反射
# commons.py
def login():
print("這是一個登陸頁面失暂!")
def logout():
print("這是一個退出頁面瓢捉!")
def home():
print("這是網(wǎng)站主頁面逼裆!")
def run():
inp = input("請輸入您想訪問頁面的url: ").strip()
modules, func = inp.split("/")
obj = __import__("lib." + modules, fromlist=True) # 注意fromlist參數(shù)
if hasattr(obj, func):
func = getattr(obj, func)
func()
else:
print("404")
if __name__ == '__main__':
run()
請輸入您想訪問頁面的url: commons/home
這是網(wǎng)站主頁面橱乱!
請輸入您想訪問頁面的url: commons/find
404
異常處理
Python內(nèi)置了幾十種常見的異常辜梳,就在builtins模塊內(nèi),無需特別導(dǎo)入
所有的異常都是異常類泳叠,首字母是大寫的
# 基本語法:
try:
pass
except Exception as ex:
pass
# try…except…語句處理異常的工作機制如下:
# 首先作瞄,執(zhí)行try子句(在關(guān)鍵字try和關(guān)鍵字except之間的語句)
# 如果沒有異常發(fā)生,忽略except子句危纫,try子句執(zhí)行后結(jié)束宗挥。
# 如果在執(zhí)行try子句的過程中發(fā)生了異常,那么try子句余下的部分將被忽略种蝶。
# 如果異常的類型和 except 之后的名稱相符契耿,那么對應(yīng)的except子句將被執(zhí)行。
try:
print("發(fā)生異常之前的語句正常執(zhí)行")
print(1/0)
print("發(fā)生異常之后的語句不會被執(zhí)行")
except ZeroDivisionError as e:
print(e)
#--------------
結(jié)果:
發(fā)生異常之前的語句正常執(zhí)行
division by zero
函數(shù)f3()調(diào)用f2()螃征,f2()調(diào)用f1()搪桂,雖然是在f1()出錯了,但只需要在f3()進(jìn)行異常捕獲盯滚,不需要每一層都捕獲異常踢械。
def f1():
return 10/0
def f2():
f1()
def f3():
f2()
try:
f3()
except ZeroDivisionError as e:
print(e)
--------------------------------------------------------
division by zero
通用異常:Exception
s1 = 'hello'
try:
int(s1)
except Exception as e:
print('錯誤')
finally和else子句
# finally子句都會被執(zhí)行
# 當(dāng)else和finally同時存在時
try:
pass
except:
pass
else:
print("else")
finally:
print("finally")
--------------------------------------------------------
else
finally
# 如果有異常發(fā)生:
try:
1/0
except:
pass
else:
print("else")
finally:
print("finally")
---------------------------------------------------------
finally
sex = int(input("Please input a number: "))
try:
if sex == 1:
print("這是個男人酗电!")
elif sex == 0:
print("這是個女人!")
else:
print("好像有什么不符合常理的事情發(fā)生了D诹小撵术!")
raise ValueError("非法的輸入")
except ValueError:
print("這是個人妖!")
finally:
print("finally")
print('END')
----------------------------------------------------------------
Please input a number: 0
這是個女人德绿!
finally
END
Please input a number: 2
好像有什么不符合常理的事情發(fā)生了:苫纭!
這是個人妖移稳!
finally
END
自定義異常
Python內(nèi)置了很多的異常類蕴纳,并且這些類都是從BaseException類派生的。
異常名 | 解釋 |
---|---|
AttributeError | 試圖訪問一個對象沒有的屬性 |
IOError | 輸入/輸出異常 |
ImportError | 無法引入模塊或包个粱;多是路徑問題或名稱錯誤 |
IndentationError | 縮進(jìn)錯誤 |
IndexError | 下標(biāo)索引錯誤 |
KeyError | 試圖訪問不存在的鍵 |
KeyboardInterrupt | Ctrl+C被按下古毛,鍵盤終止輸入 |
NameError | 使用未定義的變量 |
SyntaxError | 語法錯誤 |
TypeError | 傳入對象的類型與要求的不符合 |
UnboundLocalError | 試圖訪問一個還未被設(shè)置的局部變量 |
ValueError | 傳入一個調(diào)用者不期望的值,即使值的類型是正確的 |
OSError | 操作系統(tǒng)執(zhí)行錯誤 |
# 自定義異常應(yīng)該繼承Exception類都许,直接繼承或者間接繼承都可以
# 自定義異常的名字都以Error結(jié)尾
class MyExcept(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message
try:
raise MyExcept('我的異常!')
except MyExcept as ex:
print(ex)
------------------------------------------------------
我的異常!
包(Package):
只有包含init.py文件的目錄才會被認(rèn)作是一個包稻薇!
image.png
init.py可以是空文件,也可以有Python代碼胶征,init.py本身就是一個模塊
例如在example/p1/init.py中包含如下代碼:
all = ["x"]
這表示當(dāng)你使用from example.p1 import *這種用法時塞椎,你只會導(dǎo)入包里面的x子模塊。