Skip to content

Commit 2f275bc

Browse files
committed
Add exhaustive type checking
1 parent ca00725 commit 2f275bc

File tree

7 files changed

+136
-48
lines changed

7 files changed

+136
-48
lines changed

Pipfile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
[[source]]
2+
name = "PyPI"
23
url = "https://pypi.python.org/simple"
34
verify_ssl = true
45

56
[dev-packages]
67
pytest = "*"
8+
mypy = "*"
9+
black = "*"
710

811
[packages]
912

1013
[requires]
11-
python_version = "3.10"
14+
python_version = "3.11"
1215

1316
[scripts]
1417
test = "pytest . -vv"

Pipfile.lock

Lines changed: 112 additions & 38 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

patterns/behavioural/visitor/problem_01/algorithms/print.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from ..files import SealedFileType, Audio, Text, Image
22

3-
from typing import TypeVar, Generic
3+
from typing import TypeVar, Generic, assert_never
44

55
T = TypeVar("T", bound=SealedFileType)
66

@@ -13,8 +13,11 @@ def visit(self, element: T) -> None:
1313
elif isinstance(element, Text):
1414
PrintText().visit(element)
1515
return
16-
17-
PrintImage().visit(element)
16+
elif isinstance(element, Image):
17+
PrintImage().visit(element)
18+
return
19+
else:
20+
assert_never(element)
1821

1922

2023
class PrintAudio(Print[Audio]):

patterns/behavioural/visitor/problem_02/algorithms/print.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from ..files import SealedFileType, Audio, Text, Image
22

3-
from typing import TypeVar, Generic
3+
from typing import TypeVar, Generic, assert_never
44

55
T = TypeVar("T", bound=SealedFileType)
66

@@ -13,8 +13,11 @@ def visit(self, element: T) -> None:
1313
elif isinstance(element, Text):
1414
self.visit_text(element)
1515
return
16-
17-
self.visit_image(element)
16+
elif isinstance(element, Image):
17+
self.visit_image(element)
18+
return
19+
else:
20+
assert_never(element)
1821

1922
def visit_audio(self, element: Audio) -> None:
2023
print(f"{element.codec=}")

patterns/behavioural/visitor/solution_08/algorithms/print.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from typing import assert_never
12
from ..files import SealedFileType, Audio, Text, Image
23

34

@@ -10,6 +11,8 @@ def visit(self, element: SealedFileType) -> None:
1011
self.visit_text(text)
1112
case Image() as image:
1213
self.visit_image(image)
14+
case _ as unreachable:
15+
assert_never(unreachable)
1316

1417
def visit_audio(self, element: Audio) -> None:
1518
print(f"{element.codec=}")

patterns/behavioural/visitor/solution_09/algorithms/print.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Generic, TypeVar
1+
from typing import Generic, TypeVar, assert_never
22
from ..files import SealedFileType, Audio, Text, Image
33

44
T = TypeVar("T", bound=SealedFileType)
@@ -13,6 +13,8 @@ def visit(self, element: T) -> None:
1313
PrintText().visit(text)
1414
case Image() as image:
1515
PrintImage().visit(image)
16+
case _ as unreachable:
17+
assert_never(unreachable)
1618

1719

1820
class PrintAudio(Print[Audio]):

patterns/behavioural/visitor/solution_09/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from .files import Audio, Image, Text
1+
from .files import Audio, Image, Text, SealedFileType
22
from .algorithms import Print
33

44

55
def main():
66
collection = [Audio(), Text(), Image()]
7-
algorithm = Print()
7+
algorithm = Print[SealedFileType]()
88
for element in collection:
99
algorithm.visit(element)
1010

0 commit comments

Comments
 (0)