Python 中使用 f-string 進行字符串格式化的正確姿勢

Python 中使用 f-string 進行字符串格式化的正確姿勢

python 中使用 f-String 進行字符串格式化的正確方式


本文將深入講解如何在 Python 中正確運用 f-string 實現字符串格式化,尤其是在面對字典和列表等復雜數據結構時的應用。通過實際代碼示例,我們將展示如何安全高效地將變量嵌入字符串中,避免使用 eval() 帶來的安全隱患,并充分發揮 f-string 的優勢。


什么是 f-string?

f-string(格式化字符串字面量)是 Python 3.6 版本引入的一種全新的字符串格式化機制。它以簡潔直觀的方式將變量直接插入字符串中。相較于傳統的 % 操作符和 .format() 方法,f-string 更加清晰且執行效率更高。

基礎用法

f-string 的基本形式是在字符串前加上 f 標識符,隨后在花括號 {} 中放入變量或表達式。例如:

name = "Alice" age = 30 greeting = f"Hello, my name is {name} and I am {age} years old." print(greeting)  # 輸出: Hello, my name is Alice and I am 30 years old.

處理字典與列表

當需要在字符串中包含字典或列表時,可以直接在 f-string 中引用這些結構。Python 會自動調用其 __str__ 方法將其轉換為字符串形式。

立即學習Python免費學習筆記(深入)”;

示例:

假設有如下數據:

original_dict = {"key1": "value1", "key2": "value2"} my_data = [{"data": "example"}]

我們希望將它們插入到以下語句中:

"You are my friend.rn {original_dict}: You must not output sampleValues.rrnnMy Data: {my_data}"

可以輕松使用 f-string 實現:

original_dict = {"key1": "value1", "key2": "value2"} my_data = [{"data": "example"}] 

input_data = f"You are my friend. {original_dict}: You must not output sampleValues. My Data: {my_data}" print(input_data)

輸出結果:

You are my friend.   {'key1': 'value1', 'key2': 'value2'}: You must not output sampleValues.    My Data: [{'data': 'example'}]

為何不推薦使用 eval()?

eval() 函數能夠解析并執行字符串中的 Python 表達式。雖然它看似可以用于動態替換變量,但存在極大的安全隱患。如果字符串內容來源于不可信的渠道,eval() 可能會運行惡意代碼,造成嚴重后果。

舉例來說,如果 input_data 來自用戶輸入,并且內含 os.system(“rm -rf /”) 等命令,那么 eval() 將會執行該操作,導致系統文件被刪除。

ast.literal_eval() 的限制

ast.literal_eval() 相比于 eval() 更加安全,因為它只能處理合法的 Python 字面量(如字符串、數字、元組、列表、字典等)。然而,它的用途是解析字面量而不是進行字符串格式化。

在某些場景中嘗試用 ast.literal_eval() 解析含有變量的字符串是不合適的。因為 ast.literal_eval() 并不能識別變量名,因此會導致異常拋出。

總結

f-string 是目前 Python 中最推薦的字符串格式化方法。它不僅語法簡潔、可讀性強,而且性能優異,同時規避了 eval() 所帶來的潛在風險。當涉及字典和列表等復雜結構時,只需在 f-string 中直接引用即可,Python 會自動完成類型轉換。務必注意:永遠不要使用 eval() 來處理字符串格式化,尤其是處理來自外部的數據時。

注意事項:

  • f-string 僅適用于 Python 3.6 及以上版本。
  • 確保 f-string 中使用的變量已提前定義。
  • 如果需要在字符串中顯示花括號 {},可以用 {{ 和 }} 來進行轉義。例如:f”The value is {{ {value} }}”。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享