Skip to content

Commit 812d416

Browse files
committed
vector2d examples updated after chapter 9 split
1 parent 9da8390 commit 812d416

File tree

6 files changed

+94
-98
lines changed

6 files changed

+94
-98
lines changed

classes/vector2d_v0.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,24 @@
44
# BEGIN VECTOR2D_V0_DEMO
55
66
>>> v1 = Vector2d(3, 4)
7-
>>> x, y = v1 #<1>
7+
>>> print(v1.x, v1.y) # <1>
8+
3.0 4.0
9+
>>> x, y = v1 # <2>
810
>>> x, y
911
(3.0, 4.0)
10-
>>> v1 #<2>
12+
>>> v1 # <3>
1113
Vector2d(3.0, 4.0)
12-
>>> v1_clone = eval(repr(v1)) #<3>
13-
>>> v1 == v1_clone
14+
>>> v1_clone = eval(repr(v1)) # <4>
15+
>>> v1 == v1_clone # <5>
1416
True
15-
>>> print(v1) #<4>
17+
>>> print(v1) # <6>
1618
(3.0, 4.0)
17-
>>> octets = bytes(v1) #<5>
19+
>>> octets = bytes(v1) # <7>
1820
>>> octets
19-
b'\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
20-
>>> abs(v1) #<6>
21+
b'd\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
22+
>>> abs(v1) # <8>
2123
5.0
22-
>>> bool(v1), bool(Vector2d(0, 0)) #<7>
24+
>>> bool(v1), bool(Vector2d(0, 0)) # <9>
2325
(True, False)
2426
2527
# END VECTOR2D_V0_DEMO
@@ -41,20 +43,22 @@ def __iter__(self):
4143
return (i for i in (self.x, self.y)) # <3>
4244

4345
def __repr__(self):
44-
return 'Vector2d({!r}, {!r})'.format(*self) # <4>
46+
class_name = type(self).__name__
47+
return '{}({!r}, {!r})'.format(class_name, *self) # <4>
4548

4649
def __str__(self):
4750
return str(tuple(self)) # <5>
4851

4952
def __bytes__(self):
50-
return bytes(array(Vector2d.typecode, self)) # <6>
53+
return (bytes([ord(self.typecode)]) + # <6>
54+
bytes(array(self.typecode, self))) # <7>
5155

5256
def __eq__(self, other):
53-
return tuple(self) == tuple(other) # <7>
57+
return tuple(self) == tuple(other) # <8>
5458

5559
def __abs__(self):
56-
return math.hypot(self.x, self.y)
60+
return math.hypot(self.x, self.y) # <9>
5761

5862
def __bool__(self):
59-
return bool(abs(self)) # <8>
63+
return bool(abs(self)) # <10>
6064
# END VECTOR2D_V0

classes/vector2d_v1.py

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,35 @@
22
A 2-dimensional vector class
33
44
>>> v1 = Vector2d(3, 4)
5-
>>> x, y = v1 #<1>
5+
>>> print(v1.x, v1.y)
6+
3.0 4.0
7+
>>> x, y = v1
68
>>> x, y
79
(3.0, 4.0)
8-
>>> v1 #<2>
10+
>>> v1
911
Vector2d(3.0, 4.0)
10-
>>> v1_clone = eval(repr(v1)) #<3>
12+
>>> v1_clone = eval(repr(v1))
1113
>>> v1 == v1_clone
1214
True
13-
>>> print(v1) #<4>
15+
>>> print(v1)
1416
(3.0, 4.0)
15-
>>> octets = bytes(v1) #<5>
17+
>>> octets = bytes(v1)
1618
>>> octets
17-
b'\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
18-
>>> abs(v1) #<6>
19+
b'd\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
20+
>>> abs(v1)
1921
5.0
20-
>>> bool(v1), bool(Vector2d(0, 0)) #<7>
22+
>>> bool(v1), bool(Vector2d(0, 0))
2123
(True, False)
2224
23-
Test of .frombytes() class method:
25+
26+
Test of ``.frombytes()`` class method:
2427
2528
>>> v1_clone = Vector2d.frombytes(bytes(v1))
2629
>>> v1_clone
2730
Vector2d(3.0, 4.0)
2831
>>> v1 == v1_clone
2932
True
3033
31-
So far, Vector2d instances are unhashable:
32-
33-
# BEGIN VECTOR2D_V1_UNHASHABLE_DEMO
34-
>>> v1 = Vector2d(3, 4)
35-
>>> hash(v1)
36-
Traceback (most recent call last):
37-
...
38-
TypeError: unhashable type: 'Vector2d'
39-
>>> set([v1])
40-
Traceback (most recent call last):
41-
...
42-
TypeError: unhashable type: 'Vector2d'
43-
44-
# END VECTOR2D_V1_UNHASHABLE_DEMO
45-
4634
"""
4735

4836
from array import array
@@ -60,13 +48,15 @@ def __iter__(self):
6048
return (i for i in (self.x, self.y))
6149

6250
def __repr__(self):
63-
return 'Vector2d({!r}, {!r})'.format(*self)
51+
class_name = type(self).__name__
52+
return '{}({!r}, {!r})'.format(class_name, *self)
6453

6554
def __str__(self):
6655
return str(tuple(self))
6756

6857
def __bytes__(self):
69-
return bytes(array(Vector2d.typecode, self))
58+
return (bytes([ord(self.typecode)]) +
59+
bytes(array(self.typecode, self)))
7060

7161
def __eq__(self, other):
7262
return tuple(self) == tuple(other)
@@ -80,6 +70,7 @@ def __bool__(self):
8070
# BEGIN VECTOR2D_V1
8171
@classmethod # <1>
8272
def frombytes(cls, octets): # <2>
83-
memv = memoryview(octets).cast(cls.typecode) # <3>
84-
return cls(*memv) # <4>
73+
typecode = chr(octets[0]) # <3>
74+
memv = memoryview(octets[1:]).cast(typecode) # <4>
75+
return cls(*memv) # <5>
8576
# END VECTOR2D_V1

classes/vector2d_v2.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
A 2-dimensional vector class
33
44
>>> v1 = Vector2d(3, 4)
5+
>>> print(v1.x, v1.y)
6+
3.0 4.0
57
>>> x, y = v1
68
>>> x, y
79
(3.0, 4.0)
@@ -14,7 +16,7 @@
1416
(3.0, 4.0)
1517
>>> octets = bytes(v1)
1618
>>> octets
17-
b'\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
19+
b'd\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
1820
>>> abs(v1)
1921
5.0
2022
>>> bool(v1), bool(Vector2d(0, 0))
@@ -80,13 +82,15 @@ def __iter__(self):
8082
return (i for i in (self.x, self.y))
8183

8284
def __repr__(self):
83-
return 'Vector2d({!r}, {!r})'.format(*self)
85+
class_name = type(self).__name__
86+
return '{}({!r}, {!r})'.format(class_name, *self)
8487

8588
def __str__(self):
8689
return str(tuple(self))
8790

8891
def __bytes__(self):
89-
return bytes(array(Vector2d.typecode, self))
92+
return (bytes([ord(self.typecode)]) +
93+
bytes(array(self.typecode, self)))
9094

9195
def __eq__(self, other):
9296
return tuple(self) == tuple(other)
@@ -113,6 +117,7 @@ def __format__(self, fmt_spec=''):
113117

114118
@classmethod
115119
def frombytes(cls, octets):
116-
memv = memoryview(octets).cast(cls.typecode)
120+
typecode = chr(octets[0])
121+
memv = memoryview(octets[1:]).cast(typecode)
117122
return cls(*memv)
118123
# END VECTOR2D_V2

classes/vector2d_v2_fmt_snippet.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ def __iter__(self):
7979
return (i for i in (self.x, self.y))
8080

8181
def __repr__(self):
82-
return 'Vector2d({!r}, {!r})'.format(*self)
82+
class_name = type(self).__name__
83+
return '{}({!r}, {!r})'.format(class_name, *self)
8384

8485
def __str__(self):
8586
return str(tuple(self))

classes/vector2d_v3.py

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,28 @@
22
A 2-dimensional vector class
33
44
>>> v1 = Vector2d(3, 4)
5-
>>> x, y = v1 #<1>
5+
>>> print(v1.x, v1.y)
6+
3.0 4.0
7+
>>> x, y = v1
68
>>> x, y
79
(3.0, 4.0)
8-
>>> v1 #<2>
10+
>>> v1
911
Vector2d(3.0, 4.0)
10-
>>> v1_clone = eval(repr(v1)) #<3>
12+
>>> v1_clone = eval(repr(v1))
1113
>>> v1 == v1_clone
1214
True
13-
>>> print(v1) #<4>
15+
>>> print(v1)
1416
(3.0, 4.0)
15-
>>> octets = bytes(v1) #<5>
17+
>>> octets = bytes(v1)
1618
>>> octets
17-
b'\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
18-
>>> abs(v1) #<6>
19+
b'd\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
20+
>>> abs(v1)
1921
5.0
20-
>>> bool(v1), bool(Vector2d(0, 0)) #<7>
22+
>>> bool(v1), bool(Vector2d(0, 0))
2123
(True, False)
2224
2325
24-
Test of .frombytes() class method:
26+
Test of ``.frombytes()`` class method:
2527
2628
>>> v1_clone = Vector2d.frombytes(bytes(v1))
2729
>>> v1_clone
@@ -62,8 +64,8 @@
6264
>>> format(Vector2d(1, 1), '0.5fp')
6365
'<1.41421, 0.78540>'
6466
65-
# BEGIN VECTOR2D_V3_DEMO
66-
Test of `x` and `y` read-only properties:
67+
68+
Tests of `x` and `y` read-only properties:
6769
6870
>>> v1.x, v1.y
6971
(3.0, 4.0)
@@ -72,9 +74,8 @@
7274
...
7375
AttributeError: can't set attribute
7476
75-
# END VECTOR2D_V3_HASH_DEMO
7677
77-
# BEGIN VECTOR2D_V3_HASH_DEMO
78+
Tests of hashing:
7879
7980
>>> v1 = Vector2d(3, 4)
8081
>>> v2 = Vector2d(3.1, 4.2)
@@ -83,52 +84,45 @@
8384
>>> len(set([v1, v2]))
8485
2
8586
86-
# END VECTOR2D_V3_DEMO
87-
88-
8987
"""
9088

9189
from array import array
9290
import math
9391

94-
# BEGIN VECTOR2D_V3
9592
class Vector2d:
9693
typecode = 'd'
9794

9895
def __init__(self, x, y):
99-
self.__x = float(x) # <1>
96+
self.__x = float(x)
10097
self.__y = float(y)
10198

102-
@property # <2>
103-
def x(self): # <3>
104-
return self.__x # <4>
99+
@property
100+
def x(self):
101+
return self.__x
105102

106-
@property # <5>
103+
@property
107104
def y(self):
108105
return self.__y
109106

110107
def __iter__(self):
111-
return (i for i in (self.x, self.y)) # <6>
112-
113-
# remaining methods follow (omitted in book listing)
114-
# END VECTOR2D_V3
108+
return (i for i in (self.x, self.y))
115109

116110
def __repr__(self):
117-
return 'Vector2d({!r}, {!r})'.format(*self)
111+
class_name = type(self).__name__
112+
return '{}({!r}, {!r})'.format(class_name, *self)
118113

119114
def __str__(self):
120115
return str(tuple(self))
121116

122117
def __bytes__(self):
123-
return bytes(array(Vector2d.typecode, self))
118+
return (bytes([ord(self.typecode)]) +
119+
bytes(array(self.typecode, self)))
124120

125121
def __eq__(self, other):
126122
return tuple(self) == tuple(other)
127123

128-
# BEGIN VECTOR_V3_HASH
129124
def __hash__(self):
130125
return hash(self.x) ^ hash(self.y)
131-
# END VECTOR_V3_HASH
132126

133127
def __abs__(self):
134128
return math.hypot(self.x, self.y)
@@ -152,5 +146,6 @@ def __format__(self, fmt_spec=''):
152146

153147
@classmethod
154148
def frombytes(cls, octets):
155-
memv = memoryview(octets).cast(cls.typecode)
149+
typecode = chr(octets[0])
150+
memv = memoryview(octets[1:]).cast(typecode)
156151
return cls(*memv)

0 commit comments

Comments
 (0)