On Thu, Dec 2, 2021 at 1:21 AM Paul Moore firstname.lastname@example.org wrote:
On Wed, 1 Dec 2021 at 06:19, Chris Angelico email@example.com wrote:
- If "yes" to question 1, would you use it for any/all of (a) mutable
defaults, (b) referencing things that might have changed, (c) referencing other arguments, (d) something else?
N/A, except to say that when you enumerate the use cases like this, none of them even tempt me to use this feature.
I'm just listing some of the common use-cases, not all of them.
I think that the only thing I might use it for is to make it easier to annotate defaults (as f(a: list[int] => ) rather than as f(a: list[int] | None = None).
That's exactly the goal! It's hugely simpler to say "this is always a list, and defaults to a new empty list" than "this is a list or None, defaults to None, and hey, if it's None, I'll make a new empty list".
So I'll revise my answer to (1) and say that I *might* use this, but only in a way it wasn't intended to be used in, and mostly because I hate how verbose it is to express optional arguments in type annotations. (And the fact that the annotation exposes the sentinel value, even when you want it to be opaque). I hope I don't succumb and do that, though ;-)
That's definitely an intended use-case ("mutable defaults" above); you're focusing on the fact that it improves the annotations, I'm focusing on the fact that it improves documentation and introspection, but it's all the same improvement :)
- Do you know how to compile CPython from source, and would you be
willing to try this out? Please? :)
Sorry, I really don't have time to, in the foreseeable future. If I did have time, one thing I would experiment with is how this interacts with typing and tools like pyright and mypy (yes, I know type checkers would need updating for the new syntax, so that would mostly be a thought experiment) - as I say, I'd expect to annotate a function with an optional list argument defaulting to an empty list as f(a: list[int] => ), which means that __annotations__ needs to distinguish between this case and f(a: list[int]) with no default.
No problem, yup.
Sorry, I don't have any feedback like that. What I can say, though, is I'd find it quite hard to express the question, in the sense that I'd struggle to explain the difference between early and late bound parameters to a non-expert, much less explain why we need both. I'd probably just say "it's short for a default of None and a check" which doesn't really capture the point...
The point is that it's a shortcut for "omitted" rather than "a default of None", but there are many ways to explain it, and I only have one brother who knows enough Python to be able to talk to about this (and I got feedback from him VERY early).
Any and all comments welcomed. I mean, this is python-ideas after all... bikeshedding is what we do best!
I hope this was useful feedback.
It was. Thank you.