On Jun 25, 2019, at 08:44, James Lu <jam...@gmail.com> wrote:
> 
> What if we had reverse format strings, i.e. reading formatted input?
> 
> x = readf("{:.0%}", "50%")
> # => x == 0.50
> x = readf("{:.0}", "50")
> # => x == 0.50
> 
> Readf takes the repr() of its second argument and “un-formats” the string.

What’s the algorithm for this?

There’s at least possibly an answer for things like C printf, because the 
format specifier “%.1f” tells you the type—if you pass anything but a double to 
printf with that specifier, it’s undefined behavior, so you can write a scanf 
function that knows that “%.1f” has to “unprintf” into a double. But Python 
format specifier “.1” tells you nothing about the type—it can be passed a 
float, a str, an instance of some arbitrary user-defined type… so what type can 
tell you how to “unformat” it?

(By the way, format(50.0, “.1”) gives you “5e+01”, not “50”. And the repr of 
the string “50” is the string “‘50’”. Also, surely unformatting returns not a 
single value, but as many values as there are format specifiers, right? But 
these issues are trivial.)

It might be possible to come up with a solution to this. Maybe you could 
explicitly specify the types in the “unformat” specifier, before the colon, and 
it calls __unformat__ on that type, which returns the parsed value and the 
remainder of the string?That could work for simple cases:

    x, = unformat(“{float:.0f}”, “50”)

… or even:

    x, op, y = unformat(“{float.0f} {str:.1} {float:.0f}”, “2 * 3”)

But what happens in this case:

    x, op, y = unformat(“{float.0f} {str} {float:.0f}”, “2 * 3”)

There’s no way str.__unformat__(“”, “* 3”) can know whether to parse one 
character or the whole string or anything in between. Unless you want some 
horribly inefficient backtracking scheme, this has to be illegal. (And this is 
exactly why people come up with more restricted languages to parse. If you know 
the language is regular, you can write a regex to parse it, which actually can 
disambiguate cases like this without exponential backtracking.)
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/ABQHFVX5DOK2C2HIYPLKGUTH2MI353AC/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to