Hm, I don’t think the major use for bchr() will be with a constant. On Sun, Aug 22, 2021 at 14:48 Gregory P. Smith <g...@krypto.org> wrote:
> > On Tue, Aug 10, 2021 at 3:48 PM Christopher Barker <python...@gmail.com> > wrote: > >> On Tue, Aug 10, 2021 at 3:00 PM <raymond.hettin...@gmail.com> wrote: >> >>> The history of bytes/bytearray is a dual-purpose view. It can be used >>> in a string-like way to emulate Python 2 string handling (hence all the >>> usual string methods and a repr that displays in a string-like fashion). >>> It can also be used as an array of numbers, 0 to 255 (hence the list >>> methods and having an iterator of ints). ISTM that the authors of this PEP >>> reject or want to discourage the latter use cases. >>> >> >> I didn't read it that way, but if so, please no, I"d rather see the >> former use cases discouraged. ISTM that the Py2 string handling is still >> needed for working with mixed binary / text data -- but that should be a >> pretty specialized use case. spelling the way to create a byte, byte() sure >> makes more sense in any other context. >> >> >>> ... anything where a C programmer would an array of unsigned chars). >>> >> >> or any programmer would use an array of unsigned 8bit integers :-) numpy >> spells it: `np.uint8`, and the the type in the C99 stdint.h is `uint8_t`. >> My point is that for anyone not an "old time" C programmer, or even a >> Python2 programmer, the "character is an unsigned 8 bit int" concept is >> alien and confusing, not a helpful mnemonic. >> >> >>> For example, creating a single byte with bytes([0x1f]) isn't pleasant, >>> obvious, or fast. >>> >> >> no, though bytes([31]) isn't horrible ;-) (despite coding for over four >> decades, I'm still not comfortable with hex notation) >> >> I say it's not horrible, because bytes is a Sequence of bytes (or integer >> values between 0 and 255), initializing it with an iterable seems pretty >> reasonable, that's how we initialize most (all?) other sequences after all. >> And compatible with array.array and numpy arrays. >> > > I consider bytes([31]) notation to be horrible API design because a simple > easy to make typo of omitting the [] or using () and forgetting the > tupleizing comma turns it into a different valid call with an entirely > different meaning. bytes([31]) vs bytes((31)) vs bytes(31). > > It's also ugly to anyone who thinks about what bytecode is generated and > executed in order to do it. an entire new list object with a single > element referring to a tiny int is created and destroyed just to create a > b'\037' object? An optimizer pass to fix that up at the bytecode level > isn't easy as it can only be done when it can prove that `bytes` has not > been reassigned to something other than the builtin. Near impossible in a > lot of code. bytes.fromint(31) isn't much better in the bytecode regard, > but at least a temporary list is not being created. > > As much as I think that bytes(size: int) was a bad idea to have as an API > - bytearray(size: int) is fine and useful as it is mutable - that ship > sailed and getting rid of it would break some odd code. It doesn't have > much use, so adding fromsize(size: int) methods don't sound very compelling > as it just adds yet another way to do the same thing. we should just live > with that specific wart. > > `bchr` as a builtin... I'm with the others on saying no to any new builtin > that isn't expected to see frequent use. bchr won't see frequent use. > > `bytes.fromint` seems fine. others are proposing `bytes.byte` for that. > I don't *like* to argue over names (the last stage of anything) but I do > need to point out how that sounds to read. It falls victim to API > stuttering. "bytes dot byte" or "bytes byte" doesn't convey much to a > reader in English as the difference is a subtle "s". "bytes dot from int" > or "bytes from int" is quite clear. (avoiding stuttering in API design was > popularized by golang - it's a good thing to strive for in any language) > It's times like this that i wish Python had chosen consistent camelCase, > CapWords, or snake_case in all API names as conjoinedwords aren't great. > But they are sadly consistent with our past sins. > > One thing never mentioned in the PEP. If you expect a primary use of the > fromint (aka bchr builtin that isn't going to happen) to be called on > constant values often. Why are we adding name lookups and function calls > to this? Why not address the elephant in the room and allow for decimal > values to be written as an escape sequence within bytes literals? > > b'\d31' for example to say "decimal byte 31". Proposal: Only values 0-255 > with no leading zero should be accepted when parsing such an escape. (Do > not bother adding the same feature for codepoints in unicode strs; leave > that to later if someone shows actual demand). This can't address the > bytearray need, but that's been true of bytearray for ages, a common way to > create them is via a copy from transient bytes objects. bytearray(b'\d31') > isn't much different than bytearray.fromint(31). one less name lookup. > > Why not add a \d escape? Introducing a new escape is fraught with peril as > existing \d's within b'' literals in code could change meaning. backwards > compatibility fail. But one that is easy to check for with a > DeprecationWarning for a few releases... The new literal parsing could be > enabled per-file with a __future__ import. > > -gps > > >> -CHB >> >> >> -- >> Christopher Barker, PhD (Chris) >> >> Python Language Consulting >> - Teaching >> - Scientific Software Development >> - Desktop GUI and Web Development >> - wxPython, numpy, scipy, Cython >> _______________________________________________ >> Python-Dev mailing list -- python-dev@python.org >> To unsubscribe send an email to python-dev-le...@python.org >> https://mail.python.org/mailman3/lists/python-dev.python.org/ >> Message archived at >> https://mail.python.org/archives/list/python-dev@python.org/message/RM4JHK4GIKYYWV7J5F6IQJ66KUIXWMMF/ >> Code of Conduct: http://python.org/psf/codeofconduct/ >> > _______________________________________________ > Python-Dev mailing list -- python-dev@python.org > To unsubscribe send an email to python-dev-le...@python.org > https://mail.python.org/mailman3/lists/python-dev.python.org/ > Message archived at > https://mail.python.org/archives/list/python-dev@python.org/message/DGJWM3VMNMDBUTGYG72H5WLKDWBYFSUV/ > Code of Conduct: http://python.org/psf/codeofconduct/ > -- --Guido (mobile)
_______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/ENHJPXQR7NAHXZLWBFA6OTQNLZN4JKKA/ Code of Conduct: http://python.org/psf/codeofconduct/