Skip to content

Commit 135eca2

Browse files
committed
complete draft: update from Atlas
1 parent 08a4001 commit 135eca2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+4705
-3240
lines changed

13-protocol-abc/lotto.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from tombola import Tombola
66

77

8-
class LotteryBlower(Tombola):
8+
class LottoBlower(Tombola):
99

1010
def __init__(self, iterable):
1111
self._balls = list(iterable) # <1>
@@ -17,14 +17,14 @@ def pick(self):
1717
try:
1818
position = random.randrange(len(self._balls)) # <2>
1919
except ValueError:
20-
raise LookupError('pick from empty BingoCage')
20+
raise LookupError('pick from empty LottoBlower')
2121
return self._balls.pop(position) # <3>
2222

2323
def loaded(self): # <4>
2424
return bool(self._balls)
2525

2626
def inspect(self): # <5>
27-
return tuple(sorted(self._balls))
27+
return tuple(self._balls)
2828

2929

3030
# end::LOTTERY_BLOWER[]

13-protocol-abc/tombola.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def inspect(self):
2828
except LookupError:
2929
break
3030
self.load(items) # <7>
31-
return tuple(sorted(items))
31+
return tuple(items)
3232

3333

3434
# end::TOMBOLA_ABC[]

13-protocol-abc/tombola_runner.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
# tag::TOMBOLA_RUNNER[]
1+
#!/usr/bin/env python3
2+
23
import doctest
34

45
from tombola import Tombola
@@ -13,8 +14,7 @@
1314
def main(argv):
1415
verbose = '-v' in argv
1516
real_subclasses = Tombola.__subclasses__() # <2>
16-
virtual_subclasses = list(Tombola._abc_registry) # <3>
17-
17+
virtual_subclasses = [tombolist.TomboList] # <3>
1818
for cls in real_subclasses + virtual_subclasses: # <4>
1919
test(cls, verbose)
2020

@@ -33,4 +33,3 @@ def test(cls, verbose=False):
3333
if __name__ == '__main__':
3434
import sys
3535
main(sys.argv)
36-
# end::TOMBOLA_RUNNER[]

13-protocol-abc/tombola_tests.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ Create and load instance from iterable::
1111
>>> globe = ConcreteTombola(balls)
1212
>>> globe.loaded()
1313
True
14-
>>> globe.inspect()
15-
(0, 1, 2)
14+
>>> sorted(globe.inspect())
15+
[0, 1, 2]
1616

1717

1818
Pick and collect balls::

13-protocol-abc/tombolist.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ def loaded(self):
1818
return bool(self) # <6>
1919

2020
def inspect(self):
21-
return tuple(sorted(self))
21+
return tuple(self)
2222

2323
# Tombola.register(TomboList) # <7>

15-more-types/cafeteria/contravariant.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ def deploy(trash_can: TrashCan[Biodegradable]):
3838
# tag::DEPLOY_NOT_VALID[]
3939
compost_can: TrashCan[Compostable] = TrashCan()
4040
deploy(compost_can)
41-
# end::DEPLOY_NOT_VALID[]
42-
43-
## Argument 1 to "deploy" has
41+
## mypy: Argument 1 to "deploy" has
4442
## incompatible type "TrashCan[Compostable]"
4543
## expected "TrashCan[Biodegradable]"
44+
# end::DEPLOY_NOT_VALID[]

15-more-types/cafeteria/covariant.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ def install(dispenser: BeverageDispenser[Juice]) -> None: # <3>
3838
install(orange_juice_dispenser)
3939
# end::INSTALL_JUICE_DISPENSERS[]
4040

41-
################################################ not a juice dispenser
41+
################################################ more general dispenser
4242

43+
# tag::INSTALL_BEVERAGE_DISPENSER[]
4344
beverage_dispenser = BeverageDispenser(Beverage())
44-
45-
## Argument 1 to "install" has
45+
install(beverage_dispenser)
46+
## mypy: Argument 1 to "install" has
4647
## incompatible type "BeverageDispenser[Beverage]"
4748
## expected "BeverageDispenser[Juice]"
48-
install(beverage_dispenser)
49+
# end::INSTALL_BEVERAGE_DISPENSER[]

15-more-types/cafeteria/invariant.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def install(dispenser: BeverageDispenser[Juice]) -> None: # <4>
3737
# tag::INSTALL_BEVERAGE_DISPENSER[]
3838
beverage_dispenser = BeverageDispenser(Beverage())
3939
install(beverage_dispenser)
40-
## Argument 1 to "install" has
40+
## mypy: Argument 1 to "install" has
4141
## incompatible type "BeverageDispenser[Beverage]"
4242
## expected "BeverageDispenser[Juice]"
4343
# end::INSTALL_BEVERAGE_DISPENSER[]
@@ -48,7 +48,7 @@ def install(dispenser: BeverageDispenser[Juice]) -> None: # <4>
4848
# tag::INSTALL_ORANGE_JUICE_DISPENSER[]
4949
orange_juice_dispenser = BeverageDispenser(OrangeJuice())
5050
install(orange_juice_dispenser)
51-
# end::INSTALL_ORANGE_JUICE_DISPENSER[]
52-
## Argument 1 to "install" has
51+
## mypy: Argument 1 to "install" has
5352
## incompatible type "BeverageDispenser[OrangeJuice]"
5453
## expected "BeverageDispenser[Juice]"
54+
# end::INSTALL_ORANGE_JUICE_DISPENSER[]

15-more-types/cast/empty.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Mypy 0.812 can't spot this inevitable runtime IndexError
2+
print([][0])

15-more-types/cast/find.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# tag::CAST[]
2+
from typing import cast
3+
4+
def find_first_str(a: list[object]) -> str:
5+
index = next(i for i, x in enumerate(a) if isinstance(x, str))
6+
# We only get here if there's at least one string in a
7+
return cast(str, a[index])
8+
# end::CAST[]
9+
10+
11+
from typing import TYPE_CHECKING
12+
13+
l1 = [10, 20, 'thirty', 40]
14+
if TYPE_CHECKING:
15+
reveal_type(l1)
16+
17+
print(find_first_str(l1))
18+
19+
l2 = [0, ()]
20+
try:
21+
find_first_str(l2)
22+
except StopIteration as e:
23+
print(repr(e))

0 commit comments

Comments
 (0)