Python3.8中使用f-strings調(diào)試
前言
我日常開(kāi)發(fā)大概有98%的情況下會(huì)使用print來(lái)調(diào)試(別說(shuō)pdb之類的, 根本不實(shí)用),通過(guò)在合適的位置插入print語(yǔ)句打印出要跟蹤的表達(dá)式或者變量的值來(lái)確認(rèn)問(wèn)題。f-string讓格式化這件事變得美觀簡(jiǎn)單,但是依然對(duì)調(diào)試毫無(wú)幫助。
我舉個(gè)例子:
s = 'A string' value = 123
如果你想看運(yùn)行時(shí)s和value的值分別是多少(PS: 這里演示的是常量,在實(shí)際代碼執(zhí)行中可能他們是表達(dá)式或者函數(shù)調(diào)用計(jì)算出來(lái)的,那時(shí)它們就是動(dòng)態(tài)的了),可以在代碼中加一行print打印一下它們:
s = 'A string' value = 123 print(s, value) # 新插入的行
這樣就能通過(guò)日志或者終端知道s和value是什么了。不過(guò),這樣做的問(wèn)題是,通過(guò)輸出對(duì)應(yīng)s和value是不明確的,你需要非常清晰的了解代碼邏輯;如果代碼中有多個(gè)print,每個(gè)print都是2個(gè)參數(shù),就麻煩了:
s = 'A string' value = 123 print(s, value) o = 'Other String' rv = 234 print(o, rv) # 另外一個(gè)print
你還得用某種方法區(qū)分他們都是從哪行打印出來(lái)的:
s = 'A string' value = 123 print(s, value, 'S') o = 'Other String' rv = 234 print(o, rv, 'Other')
這是我常用的方案,多加一個(gè)參數(shù),通過(guò)第三項(xiàng)幫你確認(rèn)分別是哪行打印出來(lái)的。
好的寫法需要明確你要跟蹤的變量和值的對(duì)應(yīng)關(guān)系??梢赃@樣寫:
>>> print(f's={s!r}, value={value}')
s='A string', value=123
>>> print(f'o={o!r}, rv={rv}')
o='Other String', rv=234
大括號(hào)里面的除了有變量,后面還加個(gè) !r ,它是一個(gè)轉(zhuǎn)換標(biāo)志(conversion flag),在過(guò)去的format格式化方法中也有。一共有三種轉(zhuǎn)換標(biāo)志,另外2個(gè)分別是 !a 和 !s ,我們感受一下:
>>> '{!a}'.format('哈哈') # 相當(dāng)于 ascii('哈哈')
"'\\u54c8\\u54c8'"
>>> '{!s}'.format('哈哈') # 相當(dāng)于 str('哈哈')
'哈哈'
>>> '{!r}'.format('哈哈') # 相當(dāng)于 repr('哈哈')
"'哈哈'"
上面的例子中, {s!r} 就是對(duì)變量s執(zhí)行 str(s) ,不用(不應(yīng)該)這樣寫:
>>> print(f's={s}')
s=A string # 注意,沒(méi)有引號(hào),空格把值分開(kāi)了,有多個(gè)值的話就不容易辨識(shí)
>>> print(f's="{s}"') # 不用`!r`需要手動(dòng)加引號(hào)
s="A string"
不管怎么說(shuō),這樣其實(shí)已經(jīng)算不錯(cuò)的了,雖然當(dāng)要打印的變量比較多的時(shí)候print語(yǔ)句非常長(zhǎng)...
Python 3.8中f-strings的'='
這個(gè)功能還是看PyCON2019的閃電演講看到的,f-strings的作者Eric V. Smith接受了Larry Hastings的意見(jiàn)實(shí)現(xiàn)了f-string的調(diào)試功能。本來(lái)是想另外一個(gè)轉(zhuǎn)換標(biāo)識(shí) !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 *
也就是說(shuō),f-strings自動(dòng)添加 變量名 + = ,而且支持補(bǔ)齊空位還能做表達(dá)式求值,如上例, {value+1!d} 表示計(jì)算 value+1 再打印出來(lái)。
不過(guò)后來(lái)作者和Guido討論,改用了更靈活的 = ?,F(xiàn)在已經(jīng)合并到Python3.8,我們可以真實(shí)的試用了:
❯ ./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 *
為啥我說(shuō)用 = 更靈活呢,再看幾個(gè)混合轉(zhuǎn)換標(biāo)識(shí)的例子:
>>> x = '哈哈'
>>> f'{x=}'
"x='哈哈'"
>>> f'{x=!s}'
'x=哈哈'
>>> f'{x=!r}'
"x='哈哈'"
>>> f'{x=!a}'
"x='\\u54c8\\u54c8'"
>>> f'{x=!s:^20}'
'x= 哈哈 '
就是說(shuō),DEBUG模式可以和轉(zhuǎn)換標(biāo)識(shí)一起用!
學(xué)到了吧?開(kāi)始期待Python3.8了~
PS: 如果你看了PyCON的那個(gè)「Easier debugging with f-strings」的演講(延伸閱讀鏈接2),其中還是說(shuō)用 !d ,其實(shí)演講后第二天就改成了 = 了,要注意哈~
總結(jié)
以上所述是小編給大家介紹的Python3.8中使用f-strings調(diào)試,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
python的三目運(yùn)算符和not in運(yùn)算符使用示例
這篇文章主要介紹了python的三目運(yùn)算符和not in運(yùn)算符使用示例,需要的朋友可以參考下2014-03-03
3種Python 實(shí)現(xiàn)酷炫進(jìn)度條的實(shí)用方法
這篇文章主要介紹了3種Python 實(shí)現(xiàn)酷炫進(jìn)度條的實(shí)用方法,文章圍繞Python的相關(guān)資料展開(kāi)對(duì)實(shí)現(xiàn)進(jìn)度條的介紹,需要的小伙伴可以參考一下2022-04-04
基于Python實(shí)現(xiàn)自制CV剪貼板功能
云桌面的win10不能調(diào)出剪貼板,對(duì)于CV工程師來(lái)說(shuō)十分不方便,所以這篇文章主要介紹了如何使用Python實(shí)現(xiàn)一個(gè)CV剪貼板,提升常用語(yǔ)句的復(fù)制粘貼效率,感興趣的可以了解下2024-02-02
selenium獲取元素定位的方法總結(jié)(動(dòng)態(tài)獲取元素)
要想操作一個(gè)元素,首先應(yīng)該識(shí)別這個(gè)元素,人有各種的特征(屬性),可以通過(guò)其特征找到人,同理,界面的某個(gè)元素會(huì)有各種的特征(屬性),可以通過(guò)這個(gè)屬性找到這對(duì)象,本文給大家介紹了python?selenium獲取元素定位的8種方法,需要的朋友可以參考下2024-02-02
Python可以實(shí)現(xiàn)棧的結(jié)構(gòu)嗎
在本篇文章里小編給各位整理的是關(guān)于Python實(shí)現(xiàn)棧的結(jié)構(gòu)的條件的相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。2020-05-05
Python 跨文件夾導(dǎo)入自定義包的實(shí)現(xiàn)
有時(shí)我們自己編寫一些模塊時(shí),跨文件夾調(diào)用會(huì)出現(xiàn)ModuleNotFoundError: No module named 'XXX',本文就來(lái)介紹一下解決方法,感興趣的可以了解一下2023-11-11
在python3.64中安裝pyinstaller庫(kù)的方法步驟
這篇文章主要介紹了在python3.64中安裝pyinstaller庫(kù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

