Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/importlib_metadata/_itertools.py: 14%
22 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:35 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:35 +0000
1from itertools import filterfalse
4def unique_everseen(iterable, key=None):
5 "List unique elements, preserving order. Remember all elements ever seen."
6 # unique_everseen('AAAABBBCCDAABBB') --> A B C D
7 # unique_everseen('ABBCcAD', str.lower) --> A B C D
8 seen = set()
9 seen_add = seen.add
10 if key is None:
11 for element in filterfalse(seen.__contains__, iterable):
12 seen_add(element)
13 yield element
14 else:
15 for element in iterable:
16 k = key(element)
17 if k not in seen:
18 seen_add(k)
19 yield element
22# copied from more_itertools 8.8
23def always_iterable(obj, base_type=(str, bytes)):
24 """If *obj* is iterable, return an iterator over its items::
26 >>> obj = (1, 2, 3)
27 >>> list(always_iterable(obj))
28 [1, 2, 3]
30 If *obj* is not iterable, return a one-item iterable containing *obj*::
32 >>> obj = 1
33 >>> list(always_iterable(obj))
34 [1]
36 If *obj* is ``None``, return an empty iterable:
38 >>> obj = None
39 >>> list(always_iterable(None))
40 []
42 By default, binary and text strings are not considered iterable::
44 >>> obj = 'foo'
45 >>> list(always_iterable(obj))
46 ['foo']
48 If *base_type* is set, objects for which ``isinstance(obj, base_type)``
49 returns ``True`` won't be considered iterable.
51 >>> obj = {'a': 1}
52 >>> list(always_iterable(obj)) # Iterate over the dict's keys
53 ['a']
54 >>> list(always_iterable(obj, base_type=dict)) # Treat dicts as a unit
55 [{'a': 1}]
57 Set *base_type* to ``None`` to avoid any special handling and treat objects
58 Python considers iterable as iterable:
60 >>> obj = 'foo'
61 >>> list(always_iterable(obj, base_type=None))
62 ['f', 'o', 'o']
63 """
64 if obj is None:
65 return iter(())
67 if (base_type is not None) and isinstance(obj, base_type):
68 return iter((obj,))
70 try:
71 return iter(obj)
72 except TypeError:
73 return iter((obj,))