
On Apr 29, 2020, at 22:50, Stephen J. Turnbull <turnbull.stephen.fw@u.tsukuba.ac.jp> wrote:
Andrew Barnert via Python-ideas writes:
Also -1 on the flag.
Also -1 on the flag, for the same set of reasons.
I have to dissent somewhat from one of the complaints, though:
auto-complete won’t help at all,
Thanks for pointing this out; I didn’t realize how misleadingly I stated this. What I meant to say is that auto-complete won’t help at all with the problem that flags are less discoverable and harder to type than separate functions. Not that it won’t help at all with typing flags—it will actually help a little, it’ll just help a lot less than with separate functions, making the problem even starker rather than eliminating it. It’s worth trying this out to see for yourself.
Many (most?) people use IDEs that will catch up more or less quickly, though.
In fact, most IDEs should just automatically work without needing to change anything, because they work off the signatures and/or typesheds in the first place. That’s not the issue; the issue is what they can actually do for you. And it’s not really any different from in your terminal. In an iPython REPL in my terminal, I enter these definitions: def spam(*args, equal=False): pass def eggs(*args): pass def eggs_equal(*args): pass I can now type eggs_equal(x, y) with `e TAB TAB x, y` or `eggs_ TAB x, y`. And either way, a pop up is showing me exactly the options I want to see when I ask for completion, I’m not just typing that blind. I can type spam(x, y, equal=True) with `s TAB x, y, e TAB T TAB`. That is better than typing out the whole thing, but notice that it requires three autocompletes rather than one, and they aren’t nearly as helpful. Why? Well, it has no idea that the third argument I want to pass is the equal keyword rather than anything at all, because *args takes anything all. And, even after it knows I’m passing the equal argument, it has no idea what value I want for it, so the only way to get suggestions for what to pass as the value is to type T and complete all values in scope starting with T (and usually True will be the first one). And it’s not giving me much useful information at each step; I had to know that I was looking to type equal=True before it could help me type that. The popup signature that shows *args, equal=False does clue me in, but still not nearly as well as offering eggs_equal did. Now repeat the same thing in a source file in PyCharm, and it’s basically the same. Sure, the popups are nicer, and PyCharm actually infers that equal is of type bool even though I didn’t annotate so it can show me True, False, and all bool variables in scope instead of showing me everything in scope, but otherwise, no difference. I still need to ask for help three times instead of once, and get less guidance when I do. And that’s with a bool (or Enum) flag. Change it to end="shortest", and it’s even worse. Strings aren’t code, they’re data, so PyCharm suggests nothing at all for the argument value, while iPython suggests generally-interesting strings like the files in my cwd. (I suppose they could add a special case for this argument of this function, although they don’t do that for anything else, not even the mode argument of open—and, even if they did, at best that makes things only a little worse than a bool or Enum instead of a lot worse…)