3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
f"..."將表達(dá)式結(jié)果插入到文字中時(shí),字符串非常有用,但是您沒(méi)有文字,而是在單獨(dú)的變量中有一個(gè)模板字符串。
您可以使用str.format()將值應(yīng)用于該模板:
name=["deep","mahesh","nirbhay"]
user_input = "certi_{element}" # this string i ask from user
for value in name:
print(user_input.format(element=value))
使用名稱(chēng)(例如{element})的字符串格式化占位符不是變量。您可以為str.format()調(diào)用的關(guān)鍵字參數(shù)中的每個(gè)名稱(chēng)分配一個(gè)值。在上面的示例中,element=value傳入value變量的值以使用element.
與f-strings不同,{...}占位符不是表達(dá)式,您不能在模板中使用任意 Python 表達(dá)式。這是一件好事,您不希望最終用戶(hù)能夠在您的程序中執(zhí)行任意 Python 代碼。有關(guān)詳細(xì)信息,請(qǐng)參閱格式字符串語(yǔ)法文檔。
您可以傳入任意數(shù)量的名稱(chēng);字符串模板不具有使用其中任何一個(gè)。如果你把str.format()與**mapping調(diào)用約定,你可以使用任何字典作為價(jià)值的源泉:
template_values = {
'name': 'Ford Prefect',
'number': 42,
'company': 'Sirius Cybernetics Corporation',
'element': 'Improbability Drive',
}
print(user_input.format(**template_values)
以上將允許用戶(hù)使用template_values他們模板中的任何名稱(chēng),他們喜歡的次數(shù)不限。
雖然您可以使用locals()和globals()生成將變量名稱(chēng)映射到值的字典,但我不推薦這種方法。使用像上面這樣的專(zhuān)用命名空間來(lái)限制可用的名稱(chēng),并為您的最終用戶(hù)記錄這些名稱(chēng)。

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果你定義:
def fstr(template):
return eval(f"f'{template}'")
然后你可以這樣做:
name=["deep","mahesh","nirbhay"]
user_input = r"certi_{element}" # this string i ask from user
for element in name:
print(fstr(user_input))
作為輸出給出:
certi_deep
certi_mahesh
certi_nirbhay
但請(qǐng)注意,用戶(hù)可以在模板中使用表達(dá)式,例如:
import os # assume you have used os somewhere
user_input = r"certi_{os.environ}"
for element in name:
print(fstr(user_input))
你絕對(duì)不想要這個(gè)!
因此,更安全的選擇是定義:
def fstr(template, **kwargs):
return eval(f"f'{template}'", kwargs)
任意代碼不再可能,但用戶(hù)仍然可以使用字符串表達(dá)式,例如:
user_input = r"certi_{element.upper()*2}"
for element in name:
print(fstr(user_input, element=element))
作為輸出給出:
certi_DEEPDEEP
certi_MAHESHMAHESH
certi_NIRBHAYNIRBHAY
在某些情況下這可能是需要的。

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果您希望用戶(hù)能夠訪(fǎng)問(wèn)您的命名空間,您可以這樣做,但后果完全由您承擔(dān)。除了使用 f-strings,您還可以使用該format方法以非常相似的語(yǔ)法進(jìn)行動(dòng)態(tài)插值。
如果您希望用戶(hù)只能訪(fǎng)問(wèn)少數(shù)特定變量,您可以執(zhí)行以下操作
name=["deep", "mahesh", "nirbhay"]
user_input = "certi_{element}" # this string i ask from user
for element in name:
my_str = user_input.format(element=element)
print(f"{my_str}")
您當(dāng)然可以重命名用戶(hù)輸入的鍵與您使用的變量名稱(chēng):
my_str = user_input.format(element=some_other_variable)
你可以讓用戶(hù)訪(fǎng)問(wèn)你的整個(gè)命名空間(或至少大部分)。請(qǐng)不要這樣做,但請(qǐng)注意,您可以:
my_str = user_input.format(**locals(), **globals())
我使用print(f'{my_str}')而不是的原因print(my_str)是為了避免文字大括號(hào)被視為進(jìn)一步的錯(cuò)誤擴(kuò)展的情況。例如,user_input = 'certi_{{{element}}}'
添加回答
舉報(bào)