[New-bugs-announce] [issue46470] `_remove_dups_flatten` in `typing.py` contains dead branch

Nikita Sobolev report at bugs.python.org
Sat Jan 22 05:16:13 EST 2022


New submission from Nikita Sobolev <mail at sobolevn.me>:

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.

----------
components: Library (Lib)
messages: 411244
nosy: sobolevn
priority: normal
severity: normal
status: open
title: `_remove_dups_flatten` in `typing.py` contains dead branch
type: behavior
versions: Python 3.11

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue46470>
_______________________________________


More information about the New-bugs-announce mailing list