On 15 Jan 2014 08:23, "Ethan Furman" <et...@stoneleaf.us> wrote: > > On 01/14/2014 02:17 PM, Nick Coghlan wrote: >> >> >> On 15 Jan 2014 07:36, "Ethan Furman" <et...@stoneleaf.us <mailto: et...@stoneleaf.us>> wrote: >>> >>> >>> On 01/14/2014 12:57 PM, Antoine Pitrou wrote: >>>> >>>> >>>> On Tue, 14 Jan 2014 11:56:25 -0800 >>>> Ethan Furman <et...@stoneleaf.us <mailto:et...@stoneleaf.us>> wrote: >>>>> >>>>> >>>>> >>>>> %s, because it is the most general, has the most convoluted resolution: >>>>> >>>>> - input type is bytes? >>>>> pass it straight through >>>> >>>> >>>> >>>> It should try to get a Py_buffer instead. >>> >>> >>> >>> Meaning any bytes or bytes-subtype will support the Py_buffer protocol, and this should be the first thing we try? >>> >>> Sounds good. >>> >>> For that matter, should the first test be "does this object support Py_buffer" and not worry about it being isinstance(obj, bytes)? >> >> >> Yep. I actually suggest adjusting the %s handling to: >> >> - interpolate Py_buffer exporters directly >> - interpolate __bytes__ if defined >> - reject anything with an "encode" method >> - otherwise interpolate str(obj).encode("ascii") >> >>>>> - input type is numeric? >>>>> use its __xxx__ [1] [2] method and ascii-encode it (strictly) >>>> >>>> >>>> >>>> What is the definition of "numeric"? >>> >>> >>> >>> That is a key question. >> >> >> As suggested above, I would flip the question and explicitly *disallow* implicit encoding of any object with its own >> "encode" method, while allowing everything else. > > > Um, int and floats (for example) don't have an .encode method, don't export Py_buffer, don't have a __bytes__ method... Ah! so it would hit the last case, I see. > > The danger I see with that route is that any ol' object could then make it into the byte stream, and considering what byte streams are for I think we should make the barrier for entry higher than just relying on a __str__ or __repr__.
Yeah, reading the other thread pointed out the issues with this idea (containers in particular are a problem). I think Brett has the right idea: we shouldn't try to accept numbers for %s in binary interpolation. If we limit it to just buffer exporters and objects with a __bytes__ method then the problem goes away. The numeric codes all exist in Python 2, so the porting requirement to the common 2/3 subset will be to update the cases of binary interpolation of a number with %s to use an appropriate numeric formatting code instead. Cheers, Nick. > > > -- > ~Ethan~ > _______________________________________________ > 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/ncoghlan%40gmail.com
_______________________________________________ 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