兩個 Python 的冷技巧(2)

2021-09-20 18:47:27 字數 3201 閱讀 1217

賴勇浩(

先來看兩句**

record = cursor.execute('select * from tbl where id = 123456').fecth_all()[0]msg = struct.unpack('!i', buff)[0]

record, = cursor.execute('select * from tbl where id = 123456').fecth_all()msg, = struct.unpack('!i', buff)

注意 record 和 msg 後面的逗號,可以利用它讓 python 把這個賦值語句理解為多對多的賦值,但可省去後續的 [0] 了。

這種寫法,據我以前的同事測試,比使用 [0] 要慢上 20% 左右。如果你很在意,建議使用之前的寫法。另外,兩種寫法到底哪個更漂亮、更 pythonic,也沒有定論,但我喜歡後者。

用 configpaser 是解釋 ini 檔案的利器,因為有這麼好用庫,所以我寫的專案基本上都是用 ini 檔案來配置的。configparser 支援 default 節,寫在 default 節中的配置項可以作為實參替換後續的引用,比如在我之前提過的「

棋牌onweb」專案中,我們使用這樣的配置檔案:

[default]base_path= /home/qipai-v1/src/server[policy]switch = onport = 18843path = %(base_path)s/hall/config/flashpolicy.xml
其中 policy.path 的值取出來的時候就變成了 /home/qipai-v1/src/server/hall/config/flashpolicy.xml,configparser 會自動為你做好替換。

棋牌onweb」專案中,所有的遊戲程序都由乙個叫 desk 的程式來服務的,它通過命令列傳入的引數載入不同的外掛程式實現不同的業務邏輯。比如 desk --game-name=doudizhu 可以執行乙個鬥地主的服務,desk --game-name=xiangqi 則是中國象棋。顯然,為了方便通過日誌分析錯誤,有必要把日誌按遊戲、房間和桌子分離開來,比如 xiangqi-1-10.log 表示象棋遊戲的房間1桌子10的程序的日誌,這時候如果使用內建的 logging 模組來記錄日誌,我們可以這樣配置它:

[handler_game]class=handlers.timedrotatingfilehandler

formatter=comm

args=('log/%(game_name)s-%(rid)d-%(did)d.log', 'midnight', 1, 30)

在程式執行的時候,我們這樣初始化 logging:

logging.config.fileconfig(conf, defaults = dict(game_name = game_name, rid = rid, did = did))
把 rid 和 did 通過命令列引數傳過來即可。之所以能夠這樣做,完全因為 logging 也是使用 configparser 來解釋它的配置檔案的呀,python 吸引人之一的地方就是這樣的:盡量重用,更加靈活。

賴勇浩(

先來看兩句**

record = cursor.execute('select * from tbl where id = 123456').fecth_all()[0]msg = struct.unpack('!i', buff)[0]

record, = cursor.execute('select * from tbl where id = 123456').fecth_all()msg, = struct.unpack('!i', buff)

注意 record 和 msg 後面的逗號,可以利用它讓 python 把這個賦值語句理解為多對多的賦值,但可省去後續的 [0] 了。

這種寫法,據我以前的同事測試,比使用 [0] 要慢上 20% 左右。如果你很在意,建議使用之前的寫法。另外,兩種寫法到底哪個更漂亮、更 pythonic,也沒有定論,但我喜歡後者。

用 configpaser 是解釋 ini 檔案的利器,因為有這麼好用庫,所以我寫的專案基本上都是用 ini 檔案來配置的。configparser 支援 default 節,寫在 default 節中的配置項可以作為實參替換後續的引用,比如在我之前提過的「

棋牌onweb」專案中,我們使用這樣的配置檔案:

[default]base_path= /home/qipai-v1/src/server[policy]switch = onport = 18843path = %(base_path)s/hall/config/flashpolicy.xml
其中 policy.path 的值取出來的時候就變成了 /home/qipai-v1/src/server/hall/config/flashpolicy.xml,configparser 會自動為你做好替換。

棋牌onweb」專案中,所有的遊戲程序都由乙個叫 desk 的程式來服務的,它通過命令列傳入的引數載入不同的外掛程式實現不同的業務邏輯。比如 desk --game-name=doudizhu 可以執行乙個鬥地主的服務,desk --game-name=xiangqi 則是中國象棋。顯然,為了方便通過日誌分析錯誤,有必要把日誌按遊戲、房間和桌子分離開來,比如 xiangqi-1-10.log 表示象棋遊戲的房間1桌子10的程序的日誌,這時候如果使用內建的 logging 模組來記錄日誌,我們可以這樣配置它:

[handler_game]class=handlers.timedrotatingfilehandler

formatter=comm

args=('log/%(game_name)s-%(rid)d-%(did)d.log', 'midnight', 1, 30)

在程式執行的時候,我們這樣初始化 logging:

logging.config.fileconfig(conf, defaults = dict(game_name = game_name, rid = rid, did = did))
把 rid 和 did 通過命令列引數傳過來即可。之所以能夠這樣做,完全因為 logging 也是使用 configparser 來解釋它的配置檔案的呀,python 吸引人之一的地方就是這樣的:盡量重用,更加靈活。

兩個 Python 的冷技巧

記得剛開始工作的時候,老大給我們上 c 基礎課,告訴我們字串字面量可以換行 如下 感覺真是如夢如幻。include int main int argc,char argv 輸出 hello world.後來在寫了很久的 python 以後,才知道 python 其實也可以的 t hello worl...

Python的冷技巧小技巧

記得剛開始工作的時候,老大給我們上 c 基礎課,告訴我們字串字面量可以換行 如下 感覺真是如夢如幻。python view plain copy include int main int argc,char argv 輸出 plain view plain copy hello world.後來在寫...

ntsd的兩個技巧

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!ntsd是win2000開始自帶的命令列除錯工具 一.簡易後門 ntsd server tcp port 22 cmd.exe 在另一台機上 ntsd remote tcp server 192.168.1.33,port 22 shell 結果 ...