Python3.8中使用f-strings調(diào)試
前言
我日常開發(fā)大概有98%的情況下會使用print來調(diào)試(別說pdb之類的, 根本不實用),通過在合適的位置插入print語句打印出要跟蹤的表達式或者變量的值來確認問題。f-string讓格式化這件事變得美觀簡單,但是依然對調(diào)試毫無幫助。
我舉個例子:
s = 'A string' value = 123
如果你想看運行時s和value的值分別是多少(PS: 這里演示的是常量,在實際代碼執(zhí)行中可能他們是表達式或者函數(shù)調(diào)用計算出來的,那時它們就是動態(tài)的了),可以在代碼中加一行print打印一下它們:
s = 'A string' value = 123 print(s, value) # 新插入的行
這樣就能通過日志或者終端知道s和value是什么了。不過,這樣做的問題是,通過輸出對應s和value是不明確的,你需要非常清晰的了解代碼邏輯;如果代碼中有多個print,每個print都是2個參數(shù),就麻煩了:
s = 'A string' value = 123 print(s, value) o = 'Other String' rv = 234 print(o, rv) # 另外一個print
你還得用某種方法區(qū)分他們都是從哪行打印出來的:
s = 'A string' value = 123 print(s, value, 'S') o = 'Other String' rv = 234 print(o, rv, 'Other')
這是我常用的方案,多加一個參數(shù),通過第三項幫你確認分別是哪行打印出來的。
好的寫法需要明確你要跟蹤的變量和值的對應關系。可以這樣寫:
>>> print(f's={s!r}, value={value}') s='A string', value=123 >>> print(f'o={o!r}, rv={rv}') o='Other String', rv=234
大括號里面的除了有變量,后面還加個 !r ,它是一個轉(zhuǎn)換標志(conversion flag),在過去的format格式化方法中也有。一共有三種轉(zhuǎn)換標志,另外2個分別是 !a 和 !s ,我們感受一下:
>>> '{!a}'.format('哈哈') # 相當于 ascii('哈哈') "'\\u54c8\\u54c8'" >>> '{!s}'.format('哈哈') # 相當于 str('哈哈') '哈哈' >>> '{!r}'.format('哈哈') # 相當于 repr('哈哈') "'哈哈'"
上面的例子中, {s!r} 就是對變量s執(zhí)行 str(s) ,不用(不應該)這樣寫:
>>> print(f's={s}') s=A string # 注意,沒有引號,空格把值分開了,有多個值的話就不容易辨識 >>> print(f's="{s}"') # 不用`!r`需要手動加引號 s="A string"
不管怎么說,這樣其實已經(jīng)算不錯的了,雖然當要打印的變量比較多的時候print語句非常長...
Python 3.8中f-strings的'='
這個功能還是看PyCON2019的閃電演講看到的,f-strings的作者Eric V. Smith接受了Larry Hastings的意見實現(xiàn)了f-string的調(diào)試功能。本來是想另外一個轉(zhuǎn)換標識 !d ,效果大概是這樣:
value = 10 s = 'a string!' print(f'{value!d}') print(f'next: {value+1!d}') print(f'{s!d}') print(f'{s!d:*^20}') print(f'*{value!d:^20}*') # 輸出 value=10 next: value+1=11 s='a string!' '****s="A string"****' * value=10 *
也就是說,f-strings自動添加 變量名 + = ,而且支持補齊空位還能做表達式求值,如上例, {value+1!d} 表示計算 value+1 再打印出來。
不過后來作者和Guido討論,改用了更靈活的 = 。現(xiàn)在已經(jīng)合并到Python3.8,我們可以真實的試用了:
❯ ./python.exe Python 3.8.0a4+ (heads/master:2725cb01d7, May 22 2019, 10:29:22) ... >>> print(f'{s=}, {value=}') s='A string', value=123 >>> print(f'{o=}, {rv=}') o='Other String', rv=234 >>> print(f'{value / 3 + 15=}') value / 3 + 15=56.0 >>> print(f'{s=:*^20}') s=******A string****** >>> print(f'*{s=:^20}*') *s= A string *
為啥我說用 = 更靈活呢,再看幾個混合轉(zhuǎn)換標識的例子:
>>> x = '哈哈' >>> f'{x=}' "x='哈哈'" >>> f'{x=!s}' 'x=哈哈' >>> f'{x=!r}' "x='哈哈'" >>> f'{x=!a}' "x='\\u54c8\\u54c8'" >>> f'{x=!s:^20}' 'x= 哈哈 '
就是說,DEBUG模式可以和轉(zhuǎn)換標識一起用!
學到了吧?開始期待Python3.8了~
PS: 如果你看了PyCON的那個「Easier debugging with f-strings」的演講(延伸閱讀鏈接2),其中還是說用 !d ,其實演講后第二天就改成了 = 了,要注意哈~
總結
以上所述是小編給大家介紹的Python3.8中使用f-strings調(diào)試,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
相關文章
Ubuntu18.04安裝 PyCharm并使用 Anaconda 管理的Python環(huán)境
這篇文章主要介紹了Ubuntu18.04安裝 PyCharm并使用 Anaconda 管理的Python環(huán)境的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Python?中strip()函數(shù)詳細說明及使用方法
strip()函數(shù)是Python字符串方法之一,用于處理字符串的前導和尾隨空白字符,它返回一個新字符串,該字符串是原始字符串去除前導和尾隨空格(包括空格、制表符、換行符等)后的結果,這篇文章主要介紹了Python?中strip()函數(shù)詳細說明及使用方法,需要的朋友可以參考下2024-02-02Python 爬蟲批量爬取網(wǎng)頁圖片保存到本地的實現(xiàn)代碼
這篇文章主要介紹了Python 爬蟲批量爬取網(wǎng)頁圖片保存到本地,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Python+OpenCV實現(xiàn)車牌字符分割和識別
這篇文章主要為大家詳細介紹了Python+OpenCV實現(xiàn)車牌字符分割和識別,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03使用python搭建代理IP池實現(xiàn)接口設置與整體調(diào)度
在網(wǎng)絡爬蟲中,代理IP池是一個非常重要的組件,由于許多網(wǎng)站對單個IP的請求有限制,因此,我們需要一個代理IP池,在本文中,我們將使用Python來構建一個代理IP池,然后,我們將使用這個代理IP池來訪問我們需要的數(shù)據(jù),文中有相關的代碼示例供大家參考,需要的朋友可以參考下2023-12-12