On Thu, Aug 29, 2019 at 4:04 PM Dominik Vilsmeier <dominik.vilsme...@gmx.de>
wrote:

> I never really understood the importance of `Optional`. Often it can be
> left out altogether and in other cases I find `Union[T, None]` more
> expressive (explicit) than `Optional[T]` (+ the latter saves only 3 chars).
>

I respectfully disagree. In our (huge) codebase we see way more occurrences
of Optional than of Union. It's not that it saves a tremendous amount of
typing -- it's a much more intuitive meaning. Every time I see Union[T,
None] I have to read it carefully to see what it means. When I see
Optional[T] my brain moves on immediately (in a sense it's only one bit of
information).


> Especially for people not familiar with typing, the meaning of `Optional`
> is not obvious at first sight. `Union[T, None]` on the other hand is pretty
> clear. Also in other cases, where the default (fallback) is different from
> `None`, you'd have to use `Union` anyway. For example a function that
> normally returns an object of type `T` but in some circumstances it cannot
> and then it returns the reason as a `str`, i.e. `-> Union[T, str]`;
> `Optional` won't help here. Scanning through the docs and PEP I can't find
> strongly motivating examples for `Optional` (over `Union[T, None]`). E.g.
> in the following:
>
>     def lookup(self, name: str) -> Optional[Node]:
>         nodes = self.get(name)
>         if nodes:
>             return nodes[-1]
>         return None
>
> I would rather write `Union[Node, None]` because that's much more explicit
> about what happens.
>
> Then introducing `~T` in place of `Optional[T]` just further obfuscates
> the meaning of the code:
>
>     def lookup(self, name: str) -> ~Node:
>
> The `~` is easy to be missed (at least by human readers) and the meaning
> not obvious.
>

Do you easily miss the `-` in an expression like `-2`?

Surely the meaning of `?` in a programming language also has to be learned.
And not every language uses it to mean "optional" (IIRC there's a language
where it means "boolean" -- maybe Scheme?)


> For `Union` on the other hand it would be more helpful to have a shorter
> syntax, `int | str` seems pretty clear, but what prevents tuples `(int,
> str)` from being interpreted as unions by type checkers. This doesn't
> require any changes to the built-in types and it is aligned with the
> already existing syntax for checking multiple types with `isinstance` or
> `issubclass`: `isinstance(x, (int, str))`. Having used this a couple of
> times, whenever I see a tuple of types I immediately think of them as `or`
> options.
>

First, *if* we were to introduce `(int, str)` it would make more sense for
it to mean `Tuple[int, str]` (tuples are also a very common type). Second,
comma is already very overloaded.

Yes, it's unfortunately that `(int, str)` means "union" in `isinstance()`
but it's not enough to sway me.

Anyway, let's just paint the bikeshed *some* color. :-)

-- 
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him/his **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________
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/2PO6ODO2WZXPDSZGI7BKJAY5NT5WQMVW/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to