Skip to content

Commit daa1c75

Browse files
CaedenPHpre-commit-ci[bot]cclauss
authored
Raise error not string (TheAlgorithms#7945)
* ci: Add `B023` to `.flake8` ignores * refactor: Return `bool`/raise Exception * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * revert: Remove previous branch commit * Update data_structures/binary_tree/segment_tree_other.py Co-authored-by: Christian Clauss <[email protected]> * feat: Apply `__repr__` changes * chore: Fix failing tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update data_structures/binary_tree/segment_tree_other.py Co-authored-by: Christian Clauss <[email protected]> * test: Fix doctests * random.choice(population_score[:N_SELECTED])[0] * Update basic_string.py Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <[email protected]>
1 parent 5170853 commit daa1c75

File tree

14 files changed

+123
-120
lines changed

14 files changed

+123
-120
lines changed

boolean_algebra/quine_mc_cluskey.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
from __future__ import annotations
22

33
from collections.abc import Sequence
4+
from typing import Literal
45

56

6-
def compare_string(string1: str, string2: str) -> str:
7+
def compare_string(string1: str, string2: str) -> str | Literal[False]:
78
"""
89
>>> compare_string('0010','0110')
910
'0_10'
1011
1112
>>> compare_string('0110','1101')
12-
'X'
13+
False
1314
"""
1415
list1 = list(string1)
1516
list2 = list(string2)
@@ -19,7 +20,7 @@ def compare_string(string1: str, string2: str) -> str:
1920
count += 1
2021
list1[i] = "_"
2122
if count > 1:
22-
return "X"
23+
return False
2324
else:
2425
return "".join(list1)
2526

@@ -36,10 +37,10 @@ def check(binary: list[str]) -> list[str]:
3637
for i in range(len(binary)):
3738
for j in range(i + 1, len(binary)):
3839
k = compare_string(binary[i], binary[j])
39-
if k != "X":
40+
if k is False:
4041
check1[i] = "*"
4142
check1[j] = "*"
42-
temp.append(k)
43+
temp.append("X")
4344
for i in range(len(binary)):
4445
if check1[i] == "$":
4546
pi.append(binary[i])

ciphers/shuffled_shift_cipher.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def __str__(self) -> str:
4242
"""
4343
:return: passcode of the cipher object
4444
"""
45-
return "Passcode is: " + "".join(self.__passcode)
45+
return "".join(self.__passcode)
4646

4747
def __neg_pos(self, iterlist: list[int]) -> list[int]:
4848
"""

computer_vision/harris_corner.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ def __init__(self, k: float, window_size: int):
2222
raise ValueError("invalid k value")
2323

2424
def __str__(self) -> str:
25-
26-
return f"Harris Corner detection with k : {self.k}"
25+
return str(self.k)
2726

2827
def detect(self, img_path: str) -> tuple[cv2.Mat, list[list[int]]]:
2928

data_structures/binary_tree/segment_tree_other.py

+58-63
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,36 @@ def __init__(self, start, end, val, left=None, right=None):
1616
self.left = left
1717
self.right = right
1818

19-
def __str__(self):
20-
return f"val: {self.val}, start: {self.start}, end: {self.end}"
19+
def __repr__(self):
20+
return f"SegmentTreeNode(start={self.start}, end={self.end}, val={self.val})"
2121

2222

2323
class SegmentTree:
2424
"""
2525
>>> import operator
2626
>>> num_arr = SegmentTree([2, 1, 5, 3, 4], operator.add)
27-
>>> for node in num_arr.traverse():
28-
... print(node)
29-
...
30-
val: 15, start: 0, end: 4
31-
val: 8, start: 0, end: 2
32-
val: 7, start: 3, end: 4
33-
val: 3, start: 0, end: 1
34-
val: 5, start: 2, end: 2
35-
val: 3, start: 3, end: 3
36-
val: 4, start: 4, end: 4
37-
val: 2, start: 0, end: 0
38-
val: 1, start: 1, end: 1
27+
>>> tuple(num_arr.traverse()) # doctest: +NORMALIZE_WHITESPACE
28+
(SegmentTreeNode(start=0, end=4, val=15),
29+
SegmentTreeNode(start=0, end=2, val=8),
30+
SegmentTreeNode(start=3, end=4, val=7),
31+
SegmentTreeNode(start=0, end=1, val=3),
32+
SegmentTreeNode(start=2, end=2, val=5),
33+
SegmentTreeNode(start=3, end=3, val=3),
34+
SegmentTreeNode(start=4, end=4, val=4),
35+
SegmentTreeNode(start=0, end=0, val=2),
36+
SegmentTreeNode(start=1, end=1, val=1))
3937
>>>
4038
>>> num_arr.update(1, 5)
41-
>>> for node in num_arr.traverse():
42-
... print(node)
43-
...
44-
val: 19, start: 0, end: 4
45-
val: 12, start: 0, end: 2
46-
val: 7, start: 3, end: 4
47-
val: 7, start: 0, end: 1
48-
val: 5, start: 2, end: 2
49-
val: 3, start: 3, end: 3
50-
val: 4, start: 4, end: 4
51-
val: 2, start: 0, end: 0
52-
val: 5, start: 1, end: 1
39+
>>> tuple(num_arr.traverse()) # doctest: +NORMALIZE_WHITESPACE
40+
(SegmentTreeNode(start=0, end=4, val=19),
41+
SegmentTreeNode(start=0, end=2, val=12),
42+
SegmentTreeNode(start=3, end=4, val=7),
43+
SegmentTreeNode(start=0, end=1, val=7),
44+
SegmentTreeNode(start=2, end=2, val=5),
45+
SegmentTreeNode(start=3, end=3, val=3),
46+
SegmentTreeNode(start=4, end=4, val=4),
47+
SegmentTreeNode(start=0, end=0, val=2),
48+
SegmentTreeNode(start=1, end=1, val=5))
5349
>>>
5450
>>> num_arr.query_range(3, 4)
5551
7
@@ -62,29 +58,29 @@ class SegmentTree:
6258
>>> for node in max_arr.traverse():
6359
... print(node)
6460
...
65-
val: 5, start: 0, end: 4
66-
val: 5, start: 0, end: 2
67-
val: 4, start: 3, end: 4
68-
val: 2, start: 0, end: 1
69-
val: 5, start: 2, end: 2
70-
val: 3, start: 3, end: 3
71-
val: 4, start: 4, end: 4
72-
val: 2, start: 0, end: 0
73-
val: 1, start: 1, end: 1
61+
SegmentTreeNode(start=0, end=4, val=5)
62+
SegmentTreeNode(start=0, end=2, val=5)
63+
SegmentTreeNode(start=3, end=4, val=4)
64+
SegmentTreeNode(start=0, end=1, val=2)
65+
SegmentTreeNode(start=2, end=2, val=5)
66+
SegmentTreeNode(start=3, end=3, val=3)
67+
SegmentTreeNode(start=4, end=4, val=4)
68+
SegmentTreeNode(start=0, end=0, val=2)
69+
SegmentTreeNode(start=1, end=1, val=1)
7470
>>>
7571
>>> max_arr.update(1, 5)
7672
>>> for node in max_arr.traverse():
7773
... print(node)
7874
...
79-
val: 5, start: 0, end: 4
80-
val: 5, start: 0, end: 2
81-
val: 4, start: 3, end: 4
82-
val: 5, start: 0, end: 1
83-
val: 5, start: 2, end: 2
84-
val: 3, start: 3, end: 3
85-
val: 4, start: 4, end: 4
86-
val: 2, start: 0, end: 0
87-
val: 5, start: 1, end: 1
75+
SegmentTreeNode(start=0, end=4, val=5)
76+
SegmentTreeNode(start=0, end=2, val=5)
77+
SegmentTreeNode(start=3, end=4, val=4)
78+
SegmentTreeNode(start=0, end=1, val=5)
79+
SegmentTreeNode(start=2, end=2, val=5)
80+
SegmentTreeNode(start=3, end=3, val=3)
81+
SegmentTreeNode(start=4, end=4, val=4)
82+
SegmentTreeNode(start=0, end=0, val=2)
83+
SegmentTreeNode(start=1, end=1, val=5)
8884
>>>
8985
>>> max_arr.query_range(3, 4)
9086
4
@@ -97,29 +93,29 @@ class SegmentTree:
9793
>>> for node in min_arr.traverse():
9894
... print(node)
9995
...
100-
val: 1, start: 0, end: 4
101-
val: 1, start: 0, end: 2
102-
val: 3, start: 3, end: 4
103-
val: 1, start: 0, end: 1
104-
val: 5, start: 2, end: 2
105-
val: 3, start: 3, end: 3
106-
val: 4, start: 4, end: 4
107-
val: 2, start: 0, end: 0
108-
val: 1, start: 1, end: 1
96+
SegmentTreeNode(start=0, end=4, val=1)
97+
SegmentTreeNode(start=0, end=2, val=1)
98+
SegmentTreeNode(start=3, end=4, val=3)
99+
SegmentTreeNode(start=0, end=1, val=1)
100+
SegmentTreeNode(start=2, end=2, val=5)
101+
SegmentTreeNode(start=3, end=3, val=3)
102+
SegmentTreeNode(start=4, end=4, val=4)
103+
SegmentTreeNode(start=0, end=0, val=2)
104+
SegmentTreeNode(start=1, end=1, val=1)
109105
>>>
110106
>>> min_arr.update(1, 5)
111107
>>> for node in min_arr.traverse():
112108
... print(node)
113109
...
114-
val: 2, start: 0, end: 4
115-
val: 2, start: 0, end: 2
116-
val: 3, start: 3, end: 4
117-
val: 2, start: 0, end: 1
118-
val: 5, start: 2, end: 2
119-
val: 3, start: 3, end: 3
120-
val: 4, start: 4, end: 4
121-
val: 2, start: 0, end: 0
122-
val: 5, start: 1, end: 1
110+
SegmentTreeNode(start=0, end=4, val=2)
111+
SegmentTreeNode(start=0, end=2, val=2)
112+
SegmentTreeNode(start=3, end=4, val=3)
113+
SegmentTreeNode(start=0, end=1, val=2)
114+
SegmentTreeNode(start=2, end=2, val=5)
115+
SegmentTreeNode(start=3, end=3, val=3)
116+
SegmentTreeNode(start=4, end=4, val=4)
117+
SegmentTreeNode(start=0, end=0, val=2)
118+
SegmentTreeNode(start=1, end=1, val=5)
123119
>>>
124120
>>> min_arr.query_range(3, 4)
125121
3
@@ -128,7 +124,6 @@ class SegmentTree:
128124
>>> min_arr.query_range(1, 3)
129125
3
130126
>>>
131-
132127
"""
133128

134129
def __init__(self, collection: Sequence, function):

data_structures/binary_tree/wavelet_tree.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ def __repr__(self) -> str:
2424
"""
2525
>>> node = Node(length=27)
2626
>>> repr(node)
27-
'min_value: -1, max_value: -1'
27+
'Node(min_value=-1 max_value=-1)'
2828
>>> repr(node) == str(node)
2929
True
3030
"""
31-
return f"min_value: {self.minn}, max_value: {self.maxx}"
31+
return f"Node(min_value={self.minn} max_value={self.maxx})"
3232

3333

3434
def build_tree(arr: list[int]) -> Node | None:
@@ -37,7 +37,7 @@ def build_tree(arr: list[int]) -> Node | None:
3737
of the constructed tree
3838
3939
>>> build_tree(test_array)
40-
min_value: 0, max_value: 9
40+
Node(min_value=0 max_value=9)
4141
"""
4242
root = Node(len(arr))
4343
root.minn, root.maxx = min(arr), max(arr)

data_structures/linked_list/doubly_linked_list.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ def delete(self, data) -> str:
159159
if current.next:
160160
current = current.next
161161
else: # We have reached the end an no value matches
162-
return "No data matching given value"
162+
raise ValueError("No data matching given value")
163163

164164
if current == self.head:
165165
self.delete_head()

data_structures/queue/double_ended_queue.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ def __repr__(self) -> str:
425425
values_list.append(aux.val)
426426
aux = aux.next_node
427427

428-
return "[" + ", ".join(repr(val) for val in values_list) + "]"
428+
return f"[{', '.join(repr(val) for val in values_list)}]"
429429

430430

431431
if __name__ == "__main__":

graphs/breadth_first_search_shortest_path.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ def shortest_path(self, target_vertex: str) -> str:
5858
5959
Case 1 - No path is found.
6060
>>> g.shortest_path("Foo")
61-
'No path from vertex:G to vertex:Foo'
61+
Traceback (most recent call last):
62+
...
63+
ValueError: No path from vertex: G to vertex: Foo
6264
6365
Case 2 - The path is found.
6466
>>> g.shortest_path("D")
@@ -71,7 +73,9 @@ def shortest_path(self, target_vertex: str) -> str:
7173

7274
target_vertex_parent = self.parent.get(target_vertex)
7375
if target_vertex_parent is None:
74-
return f"No path from vertex:{self.source_vertex} to vertex:{target_vertex}"
76+
raise ValueError(
77+
f"No path from vertex: {self.source_vertex} to vertex: {target_vertex}"
78+
)
7579

7680
return self.shortest_path(target_vertex_parent) + f"->{target_vertex}"
7781

graphs/page_rank.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def add_outbound(self, node):
2727
self.outbound.append(node)
2828

2929
def __repr__(self):
30-
return f"Node {self.name}: Inbound: {self.inbound} ; Outbound: {self.outbound}"
30+
return f"<node={self.name} inbound={self.inbound} outbound={self.outbound}>"
3131

3232

3333
def page_rank(nodes, limit=3, d=0.85):

linear_algebra/src/polynom_for_points.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@ def points_to_polynomial(coordinates: list[list[int]]) -> str:
44
number of points you want to use
55
66
>>> print(points_to_polynomial([]))
7-
The program cannot work out a fitting polynomial.
7+
Traceback (most recent call last):
8+
...
9+
ValueError: The program cannot work out a fitting polynomial.
810
>>> print(points_to_polynomial([[]]))
9-
The program cannot work out a fitting polynomial.
11+
Traceback (most recent call last):
12+
...
13+
ValueError: The program cannot work out a fitting polynomial.
1014
>>> print(points_to_polynomial([[1, 0], [2, 0], [3, 0]]))
1115
f(x)=x^2*0.0+x^1*-0.0+x^0*0.0
1216
>>> print(points_to_polynomial([[1, 1], [2, 1], [3, 1]]))
@@ -25,17 +29,17 @@ def points_to_polynomial(coordinates: list[list[int]]) -> str:
2529
f(x)=x^2*5.0+x^1*-18.0+x^0*18.0
2630
"""
2731
if len(coordinates) == 0 or not all(len(pair) == 2 for pair in coordinates):
28-
return "The program cannot work out a fitting polynomial."
32+
raise ValueError("The program cannot work out a fitting polynomial.")
2933

3034
if len({tuple(pair) for pair in coordinates}) != len(coordinates):
31-
return "The program cannot work out a fitting polynomial."
35+
raise ValueError("The program cannot work out a fitting polynomial.")
3236

3337
set_x = {x for x, _ in coordinates}
3438
if len(set_x) == 1:
3539
return f"x={coordinates[0][0]}"
3640

3741
if len(set_x) != len(coordinates):
38-
return "The program cannot work out a fitting polynomial."
42+
raise ValueError("The program cannot work out a fitting polynomial.")
3943

4044
x = len(coordinates)
4145

maths/monte_carlo_dice.py

-3
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ def __init__(self):
1313
def roll(self):
1414
return random.choice(self.sides)
1515

16-
def _str_(self):
17-
return "Fair Dice"
18-
1916

2017
def throw_dice(num_throws: int, num_dice: int = 2) -> list[float]:
2118
"""

matrix/cramers_rule_2x2.py

+9-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# https://en.wikipedia.org/wiki/Cramer%27s_rule
33

44

5-
def cramers_rule_2x2(equation1: list[int], equation2: list[int]) -> str:
5+
def cramers_rule_2x2(equation1: list[int], equation2: list[int]) -> tuple[float, float]:
66
"""
77
Solves the system of linear equation in 2 variables.
88
:param: equation1: list of 3 numbers
@@ -14,13 +14,13 @@ def cramers_rule_2x2(equation1: list[int], equation2: list[int]) -> str:
1414
determinant_y = [[a1, d1], [a2, d2]]
1515
1616
>>> cramers_rule_2x2([2, 3, 0], [5, 1, 0])
17-
'Trivial solution. (Consistent system) x = 0 and y = 0'
17+
(0.0, 0.0)
1818
>>> cramers_rule_2x2([0, 4, 50], [2, 0, 26])
19-
'Non-Trivial Solution (Consistent system) x = 13.0, y = 12.5'
19+
(13.0, 12.5)
2020
>>> cramers_rule_2x2([11, 2, 30], [1, 0, 4])
21-
'Non-Trivial Solution (Consistent system) x = 4.0, y = -7.0'
21+
(4.0, -7.0)
2222
>>> cramers_rule_2x2([4, 7, 1], [1, 2, 0])
23-
'Non-Trivial Solution (Consistent system) x = 2.0, y = -1.0'
23+
(2.0, -1.0)
2424
2525
>>> cramers_rule_2x2([1, 2, 3], [2, 4, 6])
2626
Traceback (most recent call last):
@@ -75,8 +75,10 @@ def cramers_rule_2x2(equation1: list[int], equation2: list[int]) -> str:
7575
raise ValueError("No solution. (Inconsistent system)")
7676
else:
7777
if determinant_x == determinant_y == 0:
78-
return "Trivial solution. (Consistent system) x = 0 and y = 0"
78+
# Trivial solution (Inconsistent system)
79+
return (0.0, 0.0)
7980
else:
8081
x = determinant_x / determinant
8182
y = determinant_y / determinant
82-
return f"Non-Trivial Solution (Consistent system) x = {x}, y = {y}"
83+
# Non-Trivial Solution (Consistent system)
84+
return (x, y)

0 commit comments

Comments
 (0)