3 回答

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

TA貢獻2003條經驗 獲得超2個贊
如果你定義:
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
但請注意,用戶可以在模板中使用表達式,例如:
import os # assume you have used os somewhere
user_input = r"certi_{os.environ}"
for element in name:
print(fstr(user_input))
你絕對不想要這個!
因此,更安全的選擇是定義:
def fstr(template, **kwargs):
return eval(f"f'{template}'", kwargs)
任意代碼不再可能,但用戶仍然可以使用字符串表達式,例如:
user_input = r"certi_{element.upper()*2}"
for element in name:
print(fstr(user_input, element=element))
作為輸出給出:
certi_DEEPDEEP
certi_MAHESHMAHESH
certi_NIRBHAYNIRBHAY
在某些情況下這可能是需要的。

TA貢獻1993條經驗 獲得超6個贊
如果您希望用戶能夠訪問您的命名空間,您可以這樣做,但后果完全由您承擔。除了使用 f-strings,您還可以使用該format方法以非常相似的語法進行動態插值。
如果您希望用戶只能訪問少數特定變量,您可以執行以下操作
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}")
您當然可以重命名用戶輸入的鍵與您使用的變量名稱:
my_str = user_input.format(element=some_other_variable)
你可以讓用戶訪問你的整個命名空間(或至少大部分)。請不要這樣做,但請注意,您可以:
my_str = user_input.format(**locals(), **globals())
我使用print(f'{my_str}')而不是的原因print(my_str)是為了避免文字大括號被視為進一步的錯誤擴展的情況。例如,user_input = 'certi_{{{element}}}'
添加回答
舉報