forked from bslatkin/effectivepython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathitem_20.py
More file actions
executable file
·204 lines (154 loc) · 4.89 KB
/
item_20.py
File metadata and controls
executable file
·204 lines (154 loc) · 4.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#!/usr/bin/env PYTHONHASHSEED=1234 python3
# Copyright 2014-2019 Brett Slatkin, Pearson Education Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Reproduce book environment
import random
random.seed(1234)
import logging
from pprint import pprint
from sys import stdout as STDOUT
# Write all output to a temporary directory
import atexit
import gc
import io
import os
import tempfile
TEST_DIR = tempfile.TemporaryDirectory()
atexit.register(TEST_DIR.cleanup)
# Make sure Windows processes exit cleanly
OLD_CWD = os.getcwd()
atexit.register(lambda: os.chdir(OLD_CWD))
os.chdir(TEST_DIR.name)
def close_open_files():
everything = gc.get_objects()
for obj in everything:
if isinstance(obj, io.IOBase):
obj.close()
atexit.register(close_open_files)
# Example 1
# test try block division catch ZeroDivisionError with return None
def careful_divide(a, b):
try:
return a / b#for the result division
except ZeroDivisionError:
return None#when except raised divided by 0
assert careful_divide(4, 2) == 2
assert careful_divide(0, 1) == 0
assert careful_divide(3, 6) == 0.5
assert careful_divide(1, 0) == None
# Example 2
x, y = 1, 0
result = careful_divide(x, y)
# zero division return "None" true when message else result
if result is None:#return from function on except is None
print("Invalid inputs")
else:
print("Result is %.1f" % result)#if not None return from function
# Example 3
x, y = 0, 5
result = careful_divide(x, y)
print(result)
# result of 0 evaluates to false (not false => true) if true get activated wrongly
if not result:#0 or empty -> False so not False -> True
print("Invalid inputs") # This runs! But shouldn't because 0/5 is correct but 0
else:
assert False
# Example 4
# use with test extra value true/false
def careful_divide(a, b):
try:
return True, a / b #True if not divide by 0
except ZeroDivisionError:
return False, None #False only when divide by 0
assert careful_divide(4, 2) == (True, 2)
assert careful_divide(0, 1) == (True, 0)
assert careful_divide(3, 6) == (True, 0.5)
assert careful_divide(1, 0) == (False, None)
print(careful_divide(0, 1))
# test only return "None" is ZeroDivisionError
def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError:
return None
assert careful_divide(4, 2) == 2
assert careful_divide(0, 1) == 0
assert careful_divide(3, 6) == 0.5
assert careful_divide(1, 0) == None#zero divide
print(careful_divide(0, 1))
print(careful_divide(0, 1) == 0)
# Example 5
def careful_divide(a, b):
try:
return True, a / b#True divide by not 0
except ZeroDivisionError:
return False, None#False divide by 0
x, y = 5, 0
# x, y = 0, 5
success, result = careful_divide(x, y)#assign outcome function to vars
# if success assign to false the (not false) =>True that's when y = 0 and
# returm is False,None
if not success:#if divide by 0
print("Invalid inputs")
print(success, result)
# Example 6
def careful_divide(a, b):
try:
return True, a / b
except ZeroDivisionError:
return False, None
x, y = 5, 0
_, result = careful_divide(x, y)#just assign to result var
# test on result if None the "not None" gives True for if statement
if not result:#0 result to False -> not False -> true for divide by 0
print("Invalid inputs")
print(not result)
print(not None) # evaluates to True
# Example 7
# raise valueerror if ZeroDivisionError
def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError as e:
raise ValueError("Invalid inputs")
# Example 8
x, y = 5, 0
# use the valueerror to return the message else result
try:
result = careful_divide(x, y)#divide by 0 raise error in func return except
except ValueError:
print("Invalid inputs")
else:
print("Result is %.1f" % result)
# Example 9
a, b = 5, 0
# when ZeroDivisionError raise value error with message
def careful_divide(a: float, b: float) -> float:
"""Divides a by b.
Raises:
ValueError: When the inputs cannot be divided.
"""
try:
return a / b
except ZeroDivisionError as e:#when divide by 0 raise error
raise ValueError("Invalid inputs")
print(careful_divide(5, 0))
# when ZeroDivisionError raise value error and is now passed
#test for expected divide by 0
try:
result = careful_divide(1, 0)
assert False
except ValueError:
pass # Expected
assert careful_divide(1, 5) == 0.2