2016-11-23 65 views
-2

Python3.6非常酷的新功能之一是格式化字符串文字(https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-pep498)的實現。Python格式化字符串文字對象

不幸的是,它並沒有表現得像衆所周知的格式()函數:

>> a="abcd" 
>> print(f"{a[:2]}") 
>> 'ab' 

正如你看到的,切片是可能的(實際上是在字符串中的所有Python函數)。 但format()不會與切片工作:

>> print("{a[:2]}".format(a="abcd") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string indices must be integers 

有沒有辦法讓字符串對象的新的格式化字符串文字的功能?

>> string_object = "{a[:2]}" # may also be comming from a file 
>> # some way to get the result 'ab' with 'string_object' 
+0

不可以。根據文檔,這是沒有意義的:https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings就我所見,它是語法糖.format()反正。 –

+0

你可以用'eval()'在技術上做到這一點。這通常是一個壞主意,但在這種情況下,確保安全性非常困難,因爲格式字符串本身可以包含任意的Python代碼。所以,即使你首先解析字符串('ast.parse()'),並確保它只包含一個格式字符串,那麼這個單一格式字符串與eval()本身一樣危險。 – kindall

回答

0

str.format語法不,不支持全系列表達的是較新的F-字符串會。你必須手動評估片表達字符串之外,它提供給格式函數:

a = "abcd" 
string_object = "{a}".format(a = a[:2]) 

還應注意有subtle differences由F-字符串和str.format允許的語法之間,所以前者並不完全是後者的超集。

0

沒有,str.format試圖在應用它們之前先將索引轉換爲str,這就是爲什麼你會得到該錯誤;它試圖指數隨str指數字符串:

a = "abcd" 
>>> a[:'2'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: slice indices must be integers or None or have an __index__ method 

這真的是不是意味着這樣的情況下, "{a[::]}".format(a=a)可能會被評估爲a[:':']我也猜到了。

這是f-strings出現的原因之一,以支持任何Python表達式的格式化願望。