On Fri, Feb 10, 2023 at 05:48:53PM -0500, Thomas Passin wrote: > On 2/10/2023 4:55 PM, Python wrote: > > However, Python's print() function is more analogous to C's printf(), > > which returns the number of characters converted for an entirely > > different reason... It's precisely so that you'll know what the length > > of the string that was converted is. This is most useful with the > > *snprintf() variants where you're actually concerned about overrunning > > the buffer you've provided for the output string, so you can realloc() > > the buffer if it was indeed too small, but it is also useful in the > > context of, say, a routine to format text according to the size of > > your terminal. In that context it really has nothing to do with > > blocking I/O or socket behavior. > > But none of that applies to the Python print() function. There are no > buffers to overrun, no reason to know the length of the printed string, no > re-allocating of a buffer.
Indeed. But the OP originally compared print to printf, and I was specifically addressing Chris' point about why I/O functions return the number of bytes written, which was relevant to, but maybe a bit of tangent to the original post. > I don't know why the print() function doesn't return anything You do though! :) You actually just explained why yourself... it's because it just doesn't need to. But FWIW, I wasn't addressing this point, because it had already been adequately covered in the thread. There's good reason why Python's print and C's printf work differently. In languages like C it makes sense that printf returns the length of the string. printf is the means of all three of: - formatting the string - counting its length - actually outputting the string to stdout (albeit indirectly). This sort of breaks the rule of, "do one thing, and do it well," but it does so in the name of efficiency. You might or might not want to actually know the length of the formatted string, depending on what you're doing with it. But the printf function basically needs to calculate it anyway so that it can tell the underlying system calls how many bytes to write (or tell stdio how many bytes it is adding to its buffers, or whatever), and then stuffing that length in a register to be returned to the caller is roughly free (it's probably using the register that it's going to return already to do the counting), and the caller can ignore it if it wants to. C aims to be as efficient as possible so this is a good strategy. Unlike C[*], since Python can already separate the formatting and length calculation from sending the data to stdout (I demonstrated how in my first post in the thread), it has no need for print to return the length. As I mentioned in my earlier post, if Python encounters an error condition it will raise an exception--which C can't do--so there's no reason to return a status either. What else would it return? Nothing else would really make sense. -=-=-=- * In C you could sprintf the string into a buffer, which would return its length, and then call printf on the buffer, but that would be much less efficient and a bit silly... UNLESS you actually needed to know the length of the string beforehand, e.g. to calculate where to put line breaks in a text justification routine, or something. -- https://mail.python.org/mailman/listinfo/python-list