You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
_remove_dups_flatten in typing.py contains dead branch #90628
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2022-01-24.16:10:16.872>created_at=<Date2022-01-22.10:16:13.368>labels= ['type-bug', 'library', '3.11']
title='`_remove_dups_flatten` in `typing.py` contains dead branch'updated_at=<Date2022-01-24.16:10:16.872>user='https://github.com/sobolevn'
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))
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 tuples.
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.
Activity
sobolevn commentedon Jan 22, 2022
Here's how
_remove_dups_flattenis defined right now:Source:
cpython/Lib/typing.py
Line 274 in 38afeb1
It is only used in `def Union():`, source:
cpython/Lib/typing.py
Lines 522 to 523 in 38afeb1
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_typesresults. And it is reasonable:_type_checkensures thatparameterscan only contain types, nottuples.Proof:
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.
Fidget-Spinner commentedon Jan 24, 2022
New changeset c144d93 by Nikita Sobolev in branch 'main':
bpo-46470: remove unused branch from
typing._remove_dups_flatten(GH-30780)c144d93