2016-12-19 28 views
27

Dzięki David Beazley's tweet, ja niedawno okazało się, że nowy Python 3.6 f-strings mogą być zagnieżdżone:zagnieżdżone f-strings

>>> price = 478.23 
>>> f"{f'${price:0.2f}':*>20s}" 
'*************$478.23' 

czyli

>>> x = 42 
>>> f'''-{f"""*{f"+{f'.{x}.'}+"}*"""}-''' 
'-*+.42.+*-' 

Choć jestem zaskoczony, że jest to możliwe , Brakuje mi tego, jak praktyczne jest to, kiedy zagnieżdżanie łańcuchów było przydatne? Jakie zastosowania może to obejmować?

Uwaga: Sam PEP nie wspomina o zagnieżdżonych ciągach f, ale istnieje specific test case.

+2

Prawdopodobnie dokładnie w tym samym celu co gniazdowania starszej 'str.format ': http://stackoverflow.com/questions/40245650/python-fixed-width-string-format-using-vars-lub-dict – TigerhawkT3

+1

Kolejny dobry [tutaj] (http://stackoverflow.com/questions/32039239/Python-string-formatting-old-vs-new-str-format). Zostawię decyzję o tym, czy ci się udać. – TigerhawkT3

+1

@ TigerhawkT3 dzięki za dobre przykłady! Nie jestem pewien, czy są to bezpośrednie duplikaty, ale z pewnością istotne - aż do zamknięcia. Przyjmę wszystko, co zdecyduje społeczność. Mam też nadzieję, że może tu być coś konkretnego dla f-stringów. Prawdopodobnie powinniśmy podać temat i szansę. – alecxe

Odpowiedz

21

I nie myśl, że sformatowane literały łańcuchowe pozwalające na zagnieżdżanie (przez zagnieżdżenie, rozumiem jako f'{f".."}') jest wynikiem uważnego rozważenia możliwych przypadków użycia, jestem bardziej przekonany, że jest to dozwolone, aby mogły być zgodne z ich specyfikacją.

W specyfikacjach podano, że w nawiasach są one support full Python expressions. Stwierdzono także, że sformatowany napis literowy jest po prostu wyrażeniem, które jest oceniane w czasie wykonywania (patrz here i here). W rezultacie sensowne jest tylko, aby sformatowany ciąg literałowy jako wyrażenie w innym sformatowanym ciągu literałowym, zabraniałby go negować pełne wsparcie dla wyrażeń Pythona.

Fakt, że nie można znaleźć przypadków użycia wymienionych w dokumentach (i znajdują się tylko przypadki testowe w pakiecie testowym), jest prawdopodobnie dobrym (bocznym) efektem wdrożenia, a nie motywującym przypadkiem użycia .

+1

Obawiam się, że masz rację, całkowicie się zgadzam. Z przegranych na dziś - wróci jutro. Dzięki. – alecxe

+0

@alecxe Jestem pewien, że niektóre zwariowane rzeczy związane z zagnieżdżaniem 'f-string' w pewnym momencie pojawią się w dziale :-) –

-3

Można go użyć do dynamizmu. Załóżmy, że masz zmienną zestaw do nazwy niektórych funkcji:

func = 'my_func' 

Następnie można napisać:

f"{f'{func}'()}" 

co byłoby równoznaczne z:

'{}'.format(locals()[func]()) 

lub, równoważnie:

'{}'.format(my_func()) 
+0

Próbowałem i to nie działało. 'TypeError: obiekt 'str' nie jest wywoływalny' – wim

4

Domyślam się, że to przekazuje parametry formatowania w tej samej linii, a tym samym upraszcza korzystanie z przy użyciu f-stringów:.

Na przykład:

>>> import decimal 
>>> width = 10 
>>> precision = 4 
>>> value = decimal.Decimal("12.34567") 
>>> f"result: {value:{width}.{precision}}" 
'result:  12.35' 

Oczywiście, pozwala programistom na pisanie kodu całkowicie nieczytelny, ale to nie jest cel :)

+1

Tak! 'str.format' zawsze wspierał to na przykład' '{0:. {1} f}'. Format (math.pi, 4) 'jest' '3.1416''. Gdyby f-string nie mógł tego poprzeć, no cóż, byłby kulawy. – wim