On Sun, May 17, 2020 at 02:43:52PM -0400, David Mertz wrote:

> To me, itertools is not some hidden vault only accessible after performing
> Herculean labors.

+1 to David's observation here. I find it remarkable how people on this 
list who often argue "just put it on PyPI" as if that didn't condemn the 
proposal to die are now arguing that importing from itertools is an 
undue burden.


> I believe boolean mode switches are usually a bad design
> for Python.

I don't think that Python is unique in that regard.


> Not always, there are exceptions like open().

As Rhodi points out in another message, `open` is not an exception. In 
fact the opposite: `open` is an excellent example of *not* using bool 
flags. We have this:

    open(file, mode='rt', ...)

not this:

    open(file, 
         read=True,
         write=False, 
         exclusive=False,
         append=False, 
         binary=False,
         text=True,
         update=False, 
         universal=True,
         ...)


There are cases where bool flags are acceptable, even preferred. For 
example, the reverse=False parameter to sorted() seems to be okay 
because it is independent of, and orthogonal to, any other sorting 
parameters such as the key function, or the cmp function in Python 2.

If you can compose the behaviour of the flag with the other parameters, 
it might be okay. For example, back to open:

    open(..., closefd=True, ...)

seems to be fine, since it is independent of any of the value of the 
other parameters. You can pass closefd=False, or True, regardless of 
everything else. (There is a technical limitation that it must be True 
if the file is given by name, but it is independent of everything else.)

This proposed mode is not a composable flag like reverse or closefd. If 
we treat it as a flag instead of a mode, then we either rule out future 
enhancements to zip (they *must* go into new functions), or commit to 
piling bool flag upon bool flag even though most of the combinations 
will be an error.

E.g. there were proposals to make `shortest` an explicit parameter. You 
can't have `zip(shortest=True, strict=True, longest=True, ...)`.


> And I think
> Guido made the good point that one of the things that makes mode switches
> bad is when they change the return type, which the `strict=True` API would
> not do (but it would create a new kind of exception to worry about).

I think that the return type is a red herring here. Here's a strawman 
function to demonstrate that the return type is not very important in 
and of itself:

    def encode(obj, text=True):
        if text:
            return json.dumps(obj)
        else:
            return pickle.dumps(obj).decode('latin1')

Note: json.dumps is another case where the bool flags are acceptable, 
because they all control orthogonal, independent features of the call. 
Passing skipkeys=True doesn't prevent you from also passing 
ensure_ascii=False.

In contrast, you can't compose strict=True with other zip modes.


-- 
Steven
_______________________________________________
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/AV6TQFTIYCGZ2LU4IDXI3Q6DPI5K4YAF/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to