1. 程式人生 > 程式設計 >Python 如何在字串中插入變數

Python 如何在字串中插入變數

問題

你想建立一個內嵌變數的字串,變數被它的值所表示的字串替換掉。

解決方案

Python並沒有對在字串中簡單替換變數值提供直接的支援。 但是通過使用字串的 format() 方法來解決這個問題。比如:

>>> s = '{name} has {n} messages.'
>>> s.format(name='Guido',n=37)
'Guido has 37 messages.'
>>>

或者,如果要被替換的變數能在變數域中找到, 那麼你可以結合使用 format_map() vars() 。就像下面這樣:

>>> name = 'Guido'
>>> n = 37
>>> s.format_map(vars())
'Guido has 37 messages.'
>>>

vars() 還有一個有意思的特性就是它也適用於物件例項。比如:

>>> class Info:
...   def __init__(self,name,n):
...     self.name = name
...     self.n = n
...
>>> a = Info('Guido',37)
>>> s.format_map(vars(a))
'Guido has 37 messages.'
>>>

formatformat_map() 的一個缺陷就是它們並不能很好的處理變數缺失的情況,比如:

>>> s.format(name='Guido')
Traceback (most recent call last):
 File "<stdin>",line 1,in <module>
KeyError: 'n'
>>>

一種避免這種錯誤的方法是另外定義一個含有 __missing__() 方法的字典物件,就像下面這樣:

class safesub(dict):
"""防止key找不到"""
def __missing__(self,key):
  return '{' + key + '}'

現在你可以利用這個類包裝輸入後傳遞給 format_map()

>>> del n # Make sure n is undefined
>>> s.format_map(safesub(vars()))
'Guido has {n} messages.'
>>>

如果你發現自己在程式碼中頻繁的執行這些步驟,你可以將變數替換步驟用一個工具函式封裝起來。就像下面這樣:

import sys

def sub(text):
  return text.format_map(safesub(sys._getframe(1).f_locals))

現在你可以像下面這樣寫了:

>>> name = 'Guido'
>>> n = 37
>>> print(sub('Hello {name}'))
Hello Guido
>>> print(sub('You have {n} messages.'))
You have 37 messages.
>>> print(sub('Your favorite color is {color}'))
Your favorite color is {color}
>>>

討論

多年以來由於Python缺乏對變數替換的內建支援而導致了各種不同的解決方案。 作為本節中展示的一個可能的解決方案,你可以有時候會看到像下面這樣的字串格式化程式碼:

>>> name = 'Guido'
>>> n = 37
>>> '%(name) has %(n) messages.' % vars()
'Guido has 37 messages.'
>>>

你可能還會看到字串模板的使用:

>>> import string
>>> s = string.Template('$name has $n messages.')
>>> s.substitute(vars())
'Guido has 37 messages.'
>>>

然而, format() format_map() 相比較上面這些方案而已更加先進,因此應該被優先選擇。 使用 format() 方法還有一個好處就是你可以獲得對字串格式化的所有支援(對齊,填充,數字格式化等待), 而這些特性是使用像模板字串之類的方案不可能獲得的。

本機還部分介紹了一些高階特性。對映或者字典類中鮮為人知的 __missing__() 方法可以讓你定義如何處理缺失的值。 在 SafeSub 類中,這個方法被定義為對缺失的值返回一個佔位符。 你可以發現缺失的值會出現在結果字串中(在除錯的時候可能很有用),而不是產生一個 KeyError 異常。

sub() 函式使用 sys._getframe(1) 返回呼叫者的棧幀。可以從中訪問屬性 f_locals 來獲得區域性變數。 毫無疑問絕大部分情況下在程式碼中去直接操作棧幀應該是不推薦的。 但是,對於像字串替換工具函式而言它是非常有用的。 另外,值得注意的是 f_locals 是一個複製呼叫函式的本地變數的字典。 儘管你可以改變 f_locals 的內容,但是這個修改對於後面的變數訪問沒有任何影響。 所以,雖說訪問一個棧幀看上去很邪惡,但是對它的任何操作不會覆蓋和改變呼叫者本地變數的值。

以上就是Python 如何在字串中插入變數的詳細內容,更多關於Python 字串中插入變數的資料請關注我們其它相關文章!