Skip to content

Commit cde99ac

Browse files
committed
Fix flake8 and black issues
1 parent 40e2805 commit cde99ac

File tree

6 files changed

+77
-86
lines changed

6 files changed

+77
-86
lines changed

binary-search/benchmark.py

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,32 +24,31 @@ def main(args: argparse.Namespace) -> None:
2424
"""Script entry point."""
2525

2626
algorithms = {
27-
'handbag': handbag_search,
28-
'linear': linear_search,
29-
'binary': binary_search
27+
"handbag": handbag_search,
28+
"linear": linear_search,
29+
"binary": binary_search,
3030
}
3131

3232
benchmark(
33-
algorithms[args.algorithm],
34-
load_names(args.path),
35-
args.search_term)
33+
algorithms[args.algorithm], load_names(args.path), args.search_term
34+
)
3635

3736

3837
def parse_args() -> argparse.Namespace:
3938
"""Parse command line arguments."""
4039
parser = argparse.ArgumentParser()
41-
parser.add_argument('-a', '--algorithm', choices=('handbag', 'linear', 'binary'))
42-
parser.add_argument('-f', '--file', dest='path')
43-
parser.add_argument('search_term')
40+
parser.add_argument("-a", choices=("handbag", "linear", "binary"))
41+
parser.add_argument("-f", dest="path")
42+
parser.add_argument("search_term")
4443
return parser.parse_args()
4544

4645

4746
def load_names(path: str) -> List[str]:
4847
"""Return a list of names from the given file."""
49-
print('Loading names...', end='', flush=True)
48+
print("Loading names...", end="", flush=True)
5049
with open(path) as text_file:
5150
names = text_file.read().splitlines()
52-
print('ok')
51+
print("ok")
5352
return names
5453

5554

@@ -59,42 +58,46 @@ def convert(nano: int) -> str:
5958
kilo, mega, giga = 1e3, 1e6, 1e9
6059

6160
if nano < kilo:
62-
return f'{nano} ns'
61+
return f"{nano} ns"
6362

6463
if nano < mega:
65-
return f'{nano / kilo:.2f} µs'
64+
return f"{nano / kilo:.2f} µs"
6665

6766
if nano < giga:
68-
return f'{nano / mega:.2f} ms'
67+
return f"{nano / mega:.2f} ms"
6968

70-
return f'{nano / giga:.2f} s'
69+
return f"{nano / giga:.2f} s"
7170

7271

73-
def benchmark(algorithm, elements: List[str], value: str, repeat: int = 10) -> None:
72+
def benchmark(
73+
algorithm, elements: List[str], value: str, repeat: int = 10
74+
) -> None:
7475
"""Search for a value in elements using the given algorithm."""
7576

7677
times: List[int] = []
7778
for i in range(repeat):
78-
print(f'[{i + 1}/{repeat}] Searching...', end='', flush=True)
79+
print(f"[{i + 1}/{repeat}] Searching...", end="", flush=True)
7980
start_time = time.perf_counter_ns()
8081
index = algorithm(elements, value)
8182
elapsed_time = time.perf_counter_ns() - start_time
8283
times.append(elapsed_time)
83-
print('\b' * 12, end='')
84+
print("\b" * 12, end="")
8485
if index is None:
85-
print(f'Not found ({convert(elapsed_time)})')
86+
print(f"Not found ({convert(elapsed_time)})")
8687
else:
87-
print(f'Found at index={index} ({convert(elapsed_time)})')
88+
print(f"Found at index={index} ({convert(elapsed_time)})")
8889

89-
print(f'best={convert(min(times))}',
90-
f'worst={convert(max(times))}',
91-
f'avg={convert(int(sum(times) / len(times)))}',
92-
f'median={convert(int(median(times)))}',
93-
sep=', ')
90+
print(
91+
f"best={convert(min(times))}",
92+
f"worst={convert(max(times))}",
93+
f"avg={convert(int(sum(times) / len(times)))}",
94+
f"median={convert(int(median(times)))}",
95+
sep=", ",
96+
)
9497

9598

96-
if __name__ == '__main__':
99+
if __name__ == "__main__":
97100
try:
98101
main(parse_args())
99102
except KeyboardInterrupt:
100-
print('Aborted')
103+
print("Aborted")

binary-search/mandelbrot.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ def main(args: argparse.Namespace) -> None:
3737
def parse_args() -> argparse.Namespace:
3838
"""Parse command line arguments."""
3939
parser = argparse.ArgumentParser()
40-
parser.add_argument('path')
40+
parser.add_argument("path")
4141
return parser.parse_args()
4242

4343

4444
def draw(bbox: Rect, width: int, iterations: int) -> Image:
4545
"""Return an image instance."""
4646

4747
height = int(width * bbox.aspect_ratio)
48-
image = Image.new('L', (width, height))
48+
image = Image.new("L", (width, height))
4949

5050
for y in range(height):
5151
for x in range(width):
@@ -58,14 +58,14 @@ def draw(bbox: Rect, width: int, iterations: int) -> Image:
5858

5959

6060
def divergence(number: complex, max_iterations: int, limit: int = 2) -> float:
61-
"""Return Mandelbrot set membership as a value between 0 and 1 inclusive."""
61+
"""Return Mandelbrot set membership as a value between 0 and 1."""
6262
z = 0j
6363
for _ in range(max_iterations):
64-
z = z**2 + number
64+
z = z ** 2 + number
6565
if abs(z) > limit:
6666
return 0
6767
return abs(z) / limit
6868

6969

70-
if __name__ == '__main__':
70+
if __name__ == "__main__":
7171
main(parse_args())

binary-search/search/__init__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
from typing import TypeVar, Union
1+
from typing import Callable, TypeVar, Union
22

3-
T = TypeVar('T')
4-
S = TypeVar('S')
3+
T = TypeVar("T")
4+
S = TypeVar("S")
5+
6+
Key = Callable[[T], Union[T, S]]
57

68

79
def identity(element: T) -> Union[T, S]:

binary-search/search/binary.py

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
The binary search algorithm.
33
"""
44

5-
from typing import Callable, Optional, Set, Sequence, Union
5+
from typing import Optional, Set, Sequence
66

7-
from search import T, S, identity
7+
from search import T, S, Key, identity
88

99

10-
def find_index(elements: Sequence[T],
11-
value: S,
12-
key: Callable[[T], Union[T, S]] = identity) -> Optional[int]:
10+
def find_index(
11+
elements: Sequence[T], value: S, key: Key = identity
12+
) -> Optional[int]:
1313
"""Return the index of value in elements or None."""
1414

1515
left, right = 0, len(elements) - 1
@@ -30,9 +30,9 @@ def find_index(elements: Sequence[T],
3030
return None
3131

3232

33-
def find_leftmost_index(elements: Sequence[T],
34-
value: S,
35-
key: Callable[[T], Union[T, S]] = identity) -> Optional[int]:
33+
def find_leftmost_index(
34+
elements: Sequence[T], value: S, key: Key = identity
35+
) -> Optional[int]:
3636
"""Return the leftmost index of value in elements or None."""
3737

3838
index = find_index(elements, value, key)
@@ -45,9 +45,9 @@ def find_leftmost_index(elements: Sequence[T],
4545
return index
4646

4747

48-
def find_rightmost_index(elements: Sequence[T],
49-
value: S,
50-
key: Callable[[T], Union[T, S]] = identity) -> Optional[int]:
48+
def find_rightmost_index(
49+
elements: Sequence[T], value: S, key: Key = identity
50+
) -> Optional[int]:
5151
"""Return the rightmost index of value in elements or None."""
5252

5353
index = find_index(elements, value, key)
@@ -60,9 +60,9 @@ def find_rightmost_index(elements: Sequence[T],
6060
return index
6161

6262

63-
def find_all_indices(elements: Sequence[T],
64-
value: S,
65-
key: Callable[[T], Union[T, S]] = identity) -> Set[int]:
63+
def find_all_indices(
64+
elements: Sequence[T], value: S, key: Key = identity
65+
) -> Set[int]:
6666
"""Return a set of indices of elements with matching key."""
6767

6868
left = find_leftmost_index(elements, value, key)
@@ -74,37 +74,31 @@ def find_all_indices(elements: Sequence[T],
7474
return set()
7575

7676

77-
def find(elements: Sequence[T],
78-
value: S,
79-
key: Callable[[T], Union[T, S]] = identity) -> Optional[T]:
77+
def find(elements: Sequence[T], value: S, key: Key = identity) -> Optional[T]:
8078
"""Return an element with matching key or None."""
8179
return _get(elements, find_index(elements, value, key))
8280

8381

84-
def find_leftmost(elements: Sequence[T],
85-
value: S,
86-
key: Callable[[T], Union[T, S]] = identity) -> Optional[T]:
82+
def find_leftmost(
83+
elements: Sequence[T], value: S, key: Key = identity
84+
) -> Optional[T]:
8785
"""Return the leftmost element or None."""
8886
return _get(elements, find_leftmost_index(elements, value, key))
8987

9088

91-
def find_rightmost(elements: Sequence[T],
92-
value: S,
93-
key: Callable[[T], Union[T, S]] = identity) -> Optional[T]:
89+
def find_rightmost(
90+
elements: Sequence[T], value: S, key: Key = identity
91+
) -> Optional[T]:
9492
"""Return the rightmost element or None."""
9593
return _get(elements, find_rightmost_index(elements, value, key))
9694

9795

98-
def find_all(elements: Sequence[T],
99-
value: S,
100-
key: Callable[[T], Union[T, S]] = identity) -> Set[T]:
96+
def find_all(elements: Sequence[T], value: S, key: Key = identity) -> Set[T]:
10197
"""Return a set of elements with matching key."""
10298
return {elements[i] for i in find_all_indices(elements, value, key)}
10399

104100

105-
def contains(elements: Sequence[T],
106-
value: S,
107-
key: Callable[[T], Union[T, S]] = identity) -> bool:
101+
def contains(elements: Sequence[T], value: S, key: Key = identity) -> bool:
108102
"""Return True if value is present in elements."""
109103
return find_index(elements, value, key) is not None
110104

binary-search/search/handbag.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
"""
44

55
import random
6-
from typing import Callable, Optional, Set, Sequence, Union
6+
from typing import Optional, Set, Sequence
77

8-
from search import T, S, identity
8+
from search import T, S, Key, identity
99

1010

11-
def find_index(elements: Sequence[T],
12-
value: S,
13-
key: Callable[[T], Union[T, S]] = identity) -> Optional[int]:
11+
def find_index(
12+
elements: Sequence[T], value: S, key: Key = identity
13+
) -> Optional[int]:
1414
"""Return the index of value in elements or None."""
1515
visited: Set[int] = set()
1616
while len(visited) < len(elements):
@@ -21,16 +21,12 @@ def find_index(elements: Sequence[T],
2121
return None
2222

2323

24-
def find(elements: Sequence[T],
25-
value: S,
26-
key: Callable[[T], Union[T, S]] = identity) -> Optional[T]:
24+
def find(elements: Sequence[T], value: S, key: Key = identity) -> Optional[T]:
2725
"""Return an element with matching key or None."""
2826
index = find_index(elements, value, key)
2927
return None if index is None else elements[index]
3028

3129

32-
def contains(elements: Sequence[T],
33-
value: S,
34-
key: Callable[[T], Union[T, S]] = identity) -> bool:
30+
def contains(elements: Sequence[T], value: S, key: Key = identity) -> bool:
3531
"""Return True if value is present in elements."""
3632
return find_index(elements, value, key) is not None

binary-search/search/linear.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,27 @@
22
The linear search algorithm.
33
"""
44

5-
from typing import Callable, Optional, Sequence, Union
5+
from typing import Optional, Sequence
66

7-
from search import T, S, identity
7+
from search import T, S, Key, identity
88

99

10-
def find_index(elements: Sequence[T],
11-
value: S,
12-
key: Callable[[T], Union[T, S]] = identity) -> Optional[int]:
10+
def find_index(
11+
elements: Sequence[T], value: S, key: Key = identity
12+
) -> Optional[int]:
1313
"""Return the index of value in elements or None."""
1414
for i, element in enumerate(elements):
1515
if key(element) == value:
1616
return i
1717
return None
1818

1919

20-
def find(elements: Sequence[T],
21-
value: S,
22-
key: Callable[[T], Union[T, S]] = identity) -> Optional[T]:
20+
def find(elements: Sequence[T], value: S, key: Key = identity) -> Optional[T]:
2321
"""Return an element with matching key or None."""
2422
index = find_index(elements, value, key)
2523
return None if index is None else elements[index]
2624

2725

28-
def contains(elements: Sequence[T],
29-
value: S,
30-
key: Callable[[T], Union[T, S]] = identity) -> bool:
26+
def contains(elements: Sequence[T], value: S, key: Key = identity) -> bool:
3127
"""Return True if value is present in elements."""
3228
return find_index(elements, value, key) is not None

0 commit comments

Comments
 (0)