This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author sobolevn
Recipients sobolevn
Date 2022-01-22.10:16:13
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1642846573.38.0.521672483974.issue46470@roundup.psfhosted.org>
In-reply-to
Content
Here's how `_remove_dups_flatten` is defined right now:

```
def _remove_dups_flatten(parameters):
    """An internal helper for Union creation and substitution: flatten Unions
    among parameters, then remove duplicates.
    """
    # Flatten out Union[Union[...], ...].
    params = []
    for p in parameters:
        if isinstance(p, (_UnionGenericAlias, types.UnionType)):
            params.extend(p.__args__)
        elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
            params.extend(p[1:])
        else:
            params.append(p)

    return tuple(_deduplicate(params))
```

Source: https://github.com/python/cpython/blob/38afeb1a336f0451c0db86df567ef726f49f6438/Lib/typing.py#L274

It is only used in `def Union():`, source: https://github.com/python/cpython/blob/38afeb1a336f0451c0db86df567ef726f49f6438/Lib/typing.py#L522-L523

```
parameters = tuple(_type_check(p, msg) for p in parameters)
parameters = _remove_dups_flatten(parameters)
```

But, notice that `_remove_dups_flatten` contains this branch: `elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:`.

It is never executed, removing it does not change `test_typing` / `test_types` results. And it is reasonable: `_type_check` ensures that `parameters` can only contain types, not `tuple`s.

Proof:

```
>>> from typing import Union, get_type_hints

>>> Union[int, (Union, str, bool)]
# TypeError: Union[arg, ...]: each arg must be a type. Got (typing.Union, <class 'str'>, <class 'bool'>).

>>> class Some:
...    x: 'Union[int, (Union, str, bool)]'
... 
>>> get_type_hints(Some)
# TypeError: Union[arg, ...]: each arg must be a type. Got (typing.Union, <class 'str'>, <class 'bool'>).
```

Since it is pretty old, I guess the internal API has changed significantly and it is not needed anymore.

I am going to send a PR to remove it.
History
Date User Action Args
2022-01-22 10:16:13sobolevnsetrecipients: + sobolevn
2022-01-22 10:16:13sobolevnsetmessageid: <1642846573.38.0.521672483974.issue46470@roundup.psfhosted.org>
2022-01-22 10:16:13sobolevnlinkissue46470 messages
2022-01-22 10:16:13sobolevncreate