正文
本文有些零碎,總題來說,包括兩個問題:(1)可變對象(最常見的是list dict)被意外修改的問題,(2)對參數(shù)(parameter)的檢查問題。這兩個問題,本質(zhì)都是因為動態(tài)語言(動態(tài)類型語言)的特性造成了,動態(tài)語言的好處就不細說了,本文是要討論因為動態(tài)--這種靈活性帶來的一些問題。
什么是動態(tài)語言(Dynamic Programming language)呢,是相對于靜態(tài)語言而言,將很多靜態(tài)語言編譯(compilation)時期所做的事情推遲到運行時,在運行時修改代碼的行為,比如添加新的對象和函數(shù),修改既有代碼的功能,改變類型。絕大多數(shù)動態(tài)語言都是動態(tài)類型(Dynamic Typed),所謂動態(tài)類型,是在運行時確定數(shù)據(jù)類型,變量使用之前不需要類型聲明,通常變量的類型是被賦值的那個值的類型。Python就是屬于典型的動態(tài)語言。
動態(tài)語言的魅力在于讓開發(fā)人員更好的關注需要解決的問題本身,而不是冗雜的語言規(guī)范,也不用干啥都得寫個類。運行時改變代碼的行為也是非常有用,比如python的熱更新,可以做到不關服務器就替換代碼的邏輯,而靜態(tài)語言如C++就很難做到這一點。筆者使用得最多的就是C++和Python,C++中的一些復雜的點,比如模板(泛型編程)、設計模式(比如template method),在Python中使用起來非常自然。我也看到過有一些文章指出,設計模式往往是特定靜態(tài)語言的補丁 -- 為了彌補語言的缺陷或者限制。
以筆者的知識水平,遠遠不足以評價動態(tài)語言與靜態(tài)語言的優(yōu)劣。本文也只是記錄在我使用Python這門動態(tài)語言的時候,由于語言的靈活性,由于動態(tài)類型,踩過的坑,一點思考,以及困惑。
本文地址:http://www.cnblogs.com/xybaby/p/7208496.html
第一個問題:Mutable對象被誤改
這個是在線上環(huán)境出現(xiàn)過的一個BUG
事后說起來很簡單,服務端數(shù)據(jù)(放在dict里面的)被意外修改了,但查證的時候也花了許多時間,偽代碼如下:
1 def routine(dct):2 if high_propability:3 sub_routine_no_change_dct(dct)4 else:5 sub_routine_will_change_dct(dct)