2016-11-23 10 views
-2

Python3.6の非常にクールな新機能の1つは、書式設定された文字列リテラル(https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-pep498)の実装です。オブジェクトのPython書式の文字列リテラル

残念ながら、それはよく知られているフォーマット()関数のように動作しません:

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

を見ての通り、スライスは、(文字列の実際のすべてのPython関数)が可能です。 しかしformat()はスライスでは動作しません:stringオブジェクトに新しいフォーマットされた文字列リテラルの機能を取得する方法が

>> 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

いいえ、Docsによると、それは意味をなさないでしょう:https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings私が見ることができる限り、それは.format()とにかく。 –

+0

技術的には、 'eval()'で行うことができます。これは一般的には悪い考えですが、この場合、フォーマット文字列自体に任意のPythonコードが含まれる可能性があるため、安全性を保証することは二重に困難です。したがって、最初に文字列( 'ast.parse()')を解析して単一の書式文字列しか含まれていない場合でも、その単一書式文字列は 'eval()'自体と同じように危険です。 – kindall

答えて

0

str.format構文がないと表現の全範囲をサポートする、新しいF-文字列は行いません。そう、F-文字列とstr.formatによって許可された構文の間

a = "abcd" 
string_object = "{a}".format(a = a[:2]) 
また、注意すべきで

ありsubtle differences:手動で文字列の外にスライス式を評価し、代わりにフォーマット機能に供給する必要があります前者は厳密に後者のスーパーセットではないということです。

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[:':']と評価されます。

これは、フォーマットされたPython表現の欲望をサポートするために、f-stringsが出た理由の1つです。