Skip to content

Commit 5f93037

Browse files
committed
Add type hints example for duck typing
1 parent 08b54c6 commit 5f93037

File tree

6 files changed

+184
-0
lines changed

6 files changed

+184
-0
lines changed

source-code/typing/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,13 @@ Type checking can be done using [mypy](http://mypy-lang.org/index.html).
2323
which is a type error.
2424
1. `people_incorrect.py`: code that defines a `People` class, stores some
2525
in a list with mistakes.
26+
1. `duck_typing.py`: example code illustrating duck typing.
27+
1. `duck_typing_wrong.py`: example code illustrating duck typing, but
28+
with an error.
29+
1. `typed_duck_typing.py`: example code illustrating duck typing
30+
using type hints.
31+
1. `typed_duck_typing_wrong.py`: example code illustrating duck typing
32+
using type hints with an error.
33+
1. `typed_duck_typing_false_positive.py`: example code illustrating
34+
duck typing using type hints for which mypy 0.910 generates a
35+
false positive.

source-code/typing/duck_typing.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env python
2+
import argparse
3+
4+
class Duck:
5+
6+
def make_sound(self):
7+
print('quack')
8+
9+
10+
class AlarmClock:
11+
12+
def make_sound(self):
13+
print('ring-ring')
14+
15+
16+
def sound_repeater(sound_maker, nr_repeats):
17+
for _ in range(nr_repeats):
18+
sound_maker.make_sound()
19+
20+
21+
if __name__ == '__main__':
22+
arg_parser = argparse.ArgumentParser(description='sound maker')
23+
arg_parser.add_argument('--type', choices=['duck', 'alarm'],
24+
help='sound source')
25+
arg_parser.add_argument('--n', type=int, default=1,
26+
help='number of sounds to make')
27+
options = arg_parser.parse_args()
28+
sound_maker = Duck() if options.type == 'duck' else AlarmClock()
29+
sound_repeater(sound_maker, options.n)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env python
2+
import argparse
3+
4+
class Duck:
5+
6+
def quack(self):
7+
print('quack')
8+
9+
10+
class AlarmClock:
11+
12+
def make_sound(self):
13+
print('ring-ring')
14+
15+
16+
def sound_repeater(sound_maker, nr_repeats):
17+
for _ in range(nr_repeats):
18+
sound_maker.make_sound()
19+
20+
21+
if __name__ == '__main__':
22+
arg_parser = argparse.ArgumentParser(description='sound maker')
23+
arg_parser.add_argument('--type', choices=['duck', 'alarm'],
24+
help='sound source')
25+
arg_parser.add_argument('--n', type=int, default=1,
26+
help='number of sounds to make')
27+
options = arg_parser.parse_args()
28+
sound_maker = Duck() if options.type == 'duck' else AlarmClock()
29+
sound_repeater(sound_maker, options.n)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env python
2+
import argparse
3+
from typing import Protocol
4+
5+
class SoundMaker(Protocol):
6+
7+
def make_sound(self) -> None:
8+
pass
9+
10+
11+
class Duck:
12+
13+
def make_sound(self) -> None:
14+
print('quack')
15+
16+
17+
class AlarmClock:
18+
19+
def make_sound(self) -> None:
20+
print('ring-ring')
21+
22+
23+
def sound_repeater(sound_maker: SoundMaker, nr_repeats: int):
24+
for _ in range(nr_repeats):
25+
sound_maker.make_sound()
26+
27+
28+
if __name__ == '__main__':
29+
arg_parser = argparse.ArgumentParser(description='sound maker')
30+
arg_parser.add_argument('--type', choices=['duck', 'alarm'],
31+
help='sound source')
32+
arg_parser.add_argument('--n', type=int, default=1,
33+
help='number of sounds to make')
34+
options = arg_parser.parse_args()
35+
sound_maker: SoundMaker
36+
if options.type == 'duck':
37+
sound_maker = Duck()
38+
else:
39+
sound_maker = AlarmClock()
40+
sound_repeater(sound_maker, options.n)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env python
2+
import argparse
3+
from typing import Protocol
4+
5+
class SoundMaker(Protocol):
6+
7+
def make_sound(self) -> None:
8+
pass
9+
10+
11+
class Duck:
12+
13+
def make_sound(self) -> None:
14+
print('quack')
15+
16+
17+
class AlarmClock:
18+
19+
def make_sound(self) -> None:
20+
print('ring-ring')
21+
22+
23+
def sound_repeater(sound_maker: SoundMaker, nr_repeats: int):
24+
for _ in range(nr_repeats):
25+
sound_maker.make_sound()
26+
27+
28+
if __name__ == '__main__':
29+
arg_parser = argparse.ArgumentParser(description='sound maker')
30+
arg_parser.add_argument('--type', choices=['duck', 'alarm'],
31+
help='sound source')
32+
arg_parser.add_argument('--n', type=int, default=1,
33+
help='number of sounds to make')
34+
options = arg_parser.parse_args()
35+
sound_maker: SoundMaker = Duck() if options.type == 'duck' else AlarmClock()
36+
sound_repeater(sound_maker, options.n)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env python
2+
import argparse
3+
from typing import Protocol
4+
5+
class SoundMaker(Protocol):
6+
7+
def make_sound(self) -> None:
8+
pass
9+
10+
11+
class Duck:
12+
13+
def quack(self) -> None:
14+
print('quack')
15+
16+
17+
class AlarmClock:
18+
19+
def make_sound(self) -> None:
20+
print('ring-ring')
21+
22+
23+
def sound_repeater(sound_maker: SoundMaker, nr_repeats: int):
24+
for _ in range(nr_repeats):
25+
sound_maker.make_sound()
26+
27+
28+
if __name__ == '__main__':
29+
arg_parser = argparse.ArgumentParser(description='sound maker')
30+
arg_parser.add_argument('--type', choices=['duck', 'alarm'],
31+
help='sound source')
32+
arg_parser.add_argument('--n', type=int, default=1,
33+
help='number of sounds to make')
34+
options = arg_parser.parse_args()
35+
sound_maker: SoundMaker
36+
if options.type == 'duck':
37+
sound_maker = Duck()
38+
else:
39+
sound_maker = AlarmClock()
40+
sound_repeater(sound_maker, options.n)

0 commit comments

Comments
 (0)