On 9/5/2015 1:28 PM, Nathaniel Smith wrote: > On Sep 5, 2015 9:20 AM, "Guido van Rossum" <gu...@python.org > <mailto:gu...@python.org>> wrote: >> >> The processing of f-strings described by the PEP uses several phases: >> >> - find the end of the string (the final quote[s]) using the same > algorithm used for all string literals >> - expand \ escapes (e.g. \uXXXX) > > It might be worth calling out explicitly in the text how this works for > what I suspect will be the most common case: embedded quoting embedded > quotes, like > > f"{ table[\"foo\"] }" > >> - look for single {, then scan ahead to a matching } -- this skips > matching () [] {} > > I assume this part of the algorithm uses the lexer and scans for > matching tokens rather than just scanning for characters? I tried > looking at the PEP to double check but couldn't find the relevant part. > It's important for things like > > f"{ '}' }"
Actually, my current implementation doesn't use the lexer, although I suppose it could. I'm currently manually scanning the string, keeping track of strings and parens. To find the end of an expression, it looks for a '!', ':', or non-doubled '}', not inside of a string or (), [], or {}. There's a special case for '!=' so the bang isn't seen as ending the expression. So it does work on this f-string: >>> f"{ '}' }" '}' Although by using the lexer, I'd be worried about multiple levels of escaping. I'd have to give it some thought. >> - look for optional !a,!r,!s and !<spec> inside each {...} pair >> - take what's left, enclose it in (), parse as expression > > In fact maybe this whole list that Guido wrote should be copied into the > PEP; it's a good summary :-). I think the PEP does say these things, but maybe it could be tightened up. Eric. _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com