Introduction
Introduction Statistics Contact Development Disclaimer Help
sethmlarson.dev_werkzeug.atom.xml - sfeed_tests - sfeed tests and RSS and Atom …
git clone git://git.codemadness.org/sfeed_tests
Log
Files
Refs
README
LICENSE
---
sethmlarson.dev_werkzeug.atom.xml (458966B)
---
1 <?xml version="1.0" encoding="utf-8"?>
2 <feed xmlns="http://www.w3.org/2005/Atom">
3 <title type="text">sethmlarson.dev - Last 5 Blog Posts</title>
4 <id>http://sethmlarson.dev/feed</id>
5 <updated>2022-02-08T00:00:00Z</updated>
6 <link href="http://sethmlarson.dev/" />
7 <link href="http://sethmlarson.dev/feed" rel="self" />
8 <generator>Werkzeug</generator>
9 <entry xml:base="http://sethmlarson.dev/feed">
10 <title type="text">How does UTF-8 turn β€œπŸ˜‚β€ into β€œF09F9882οΏ½…
11 <id>http://sethmlarson.dev/blog/utf-8?date=2022-02-08</id>
12 <updated>2022-02-08T00:00:00Z</updated>
13 <published>2022-02-08T00:00:00Z</published>
14 <link href="http://sethmlarson.dev/blog/utf-8?date=2022-02-08" />
15 <author>
16 <name>Seth Michael Larson</name>
17 </author>
18 <content type="html">&lt;!DOCTYPE html&gt;
19 &lt;html lang=&quot;en&quot;&gt;
20 &lt;head&gt;
21 &lt;meta charset=&quot;utf-8&quot;&gt;
22 &lt;title&gt;How does UTF-8 turn β€œπŸ˜‚β€ into β€œF09F9882”?&lt;…
23 &lt;meta name=&quot;description&quot; content=&quot;Blogging about P…
24 &lt;meta name=&quot;keywords&quot; content=&quot;blog python open so…
25 &lt;meta name=&quot;author&quot; content=&quot;Seth Michael Larson&q…
26 &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,…
27 &lt;meta name=&quot;format-detection&quot; content=&quot;telephone=n…
28 &lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&qu…
29 &lt;link rel=&quot;icon&quot; href=&quot;/static/favicon.ico&quot;&g…
30 &lt;link rel=&quot;stylesheet&quot; href=&quot;/static/style.css&quo…
31
32 &lt;meta property=&quot;og:site_name&quot; content=&quot;Seth Michae…
33 &lt;meta property=&quot;og:author&quot; content=&quot;Seth Michael L…
34 &lt;meta property=&quot;og:type&quot; content=&quot;article&quot;/&g…
35 &lt;meta property=&quot;og:title&quot; content=&quot;How does UTF-8 …
36 &lt;meta property=&quot;og:description&quot; content=&quot;If you&am…
37
38
39 &amp;amp;#xa;&amp;amp;#xa;0x820x820x980...&quot;/&gt;
40 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
41 &lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;/&…
42 &lt;meta name=&quot;twitter:site&quot; content=&quot;@sethmlarson&qu…
43 &lt;meta name=&quot;twitter:creator&quot; content=&quot;@sethmlarson…
44 &lt;meta name=&quot;twitter:title&quot; content=&quot;How does UTF-8…
45 &lt;meta name=&quot;twitter:description&quot; content=&quot;If you&a…
46
47
48 &amp;amp;#xa;&amp;amp;#xa;0x820x820x980...&quot;/&gt;
49 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
50
51 &lt;/head&gt;
52 &lt;body&gt;
53 &lt;div class=&quot;container&quot;&gt;
54 &lt;div class=&quot;row&quot;&gt;
55 &lt;div class=&quot;col-6&quot;&gt;
56 &lt;center&gt;
57 &lt;h1 style=&quot;margin-bottom: 0.1em; font-size: 1.8e…
58 &lt;span style=&quot;font-style: italic;&quot;&gt;Bloggi…
59 &lt;/center&gt;
60 &lt;/div&gt;
61 &lt;div class=&quot;col-6&quot;&gt;
62 &lt;div class=&quot;navbar-outer&quot;&gt;
63 &lt;div class=&quot;navbar-inner&quot;&gt;
64 &lt;a class=&quot;icon&quot; href=&quot;/about&quot;…
65 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
66 &lt;title&gt;About&lt;/title&gt;&lt;path d=&…
67 &lt;/svg&gt;
68 &lt;/a&gt;
69 &lt;a class=&quot;icon&quot; href=&quot;/blog&quot;&…
70 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
71 &lt;title&gt;Blog&lt;/title&gt;&lt;path d=&q…
72 &lt;/svg&gt;
73 &lt;/a&gt;
74 &lt;a class=&quot;icon&quot; href=&quot;https://twit…
75 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
76 &lt;title&gt;Twitter&lt;/title&gt;&lt;path d…
77 &lt;/svg&gt;
78 &lt;/a&gt;
79 &lt;a class=&quot;icon&quot; href=&quot;https://gith…
80 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
81 &lt;title&gt;GitHub&lt;/title&gt;&lt;path d=…
82 &lt;/svg&gt;
83 &lt;/a&gt;
84 &lt;a class=&quot;icon&quot; href=&quot;https://link…
85 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
86 &lt;title&gt;LinkedIn&lt;/title&gt;&lt;path …
87 &lt;/svg&gt;
88 &lt;/a&gt;
89 &lt;/div&gt;
90 &lt;/div&gt;
91 &lt;/div&gt;
92 &lt;/div&gt;
93
94 &lt;div class=&quot;row&quot;&gt;
95 &lt;div class=&quot;col-12&quot;&gt;
96 &lt;h2 class=&quot;blog-title&quot; style=&quot;text-align: cent…
97 &lt;p&gt;&lt;center&gt;Published 2022-02-08 β€” &lt;span class=&…
98 &lt;/div&gt;
99 &lt;/div&gt;
100 &lt;div class=&quot;row&quot;&gt;
101 &lt;div class=&quot;col-12&quot;&gt;
102 &lt;p&gt;If you're anything like me, you love emojis! Emojis app…
103
104 &lt;p&gt;&lt;center&gt;
105 &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;h…
106 &lt;/center&gt;&lt;/p&gt;
107
108 &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://w3techs.com/technologies…
109
110 &lt;p&gt;I recently learned how UTF-8 works and felt that the definition…
111
112 &lt;h2&gt;What is UTF-8?&lt;/h2&gt;
113
114 &lt;p&gt;UTF-8 is an encoding currently defined in &lt;a href=&quot;http…
115
116 &lt;div class=&quot;row&quot;&gt;
117 &lt;div class=&quot;col-6&quot;&gt;
118
119 &lt;h2&gt;The 5 octets of UTF-8&lt;/h2&gt;
120
121 &lt;blockquote&gt;
122 &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; I use the term &quot;octet…
123 &lt;/blockquote&gt;
124
125 &lt;p&gt;
126 Every octet that can be produced using UTF-8 will fall into one of five …
127 &lt;/p&gt;
128
129 &lt;p&gt;
130 Each octet also has &quot;empty&quot; spaces for bits (visualized as &lt…
131 &lt;/p&gt;
132
133 &lt;/div&gt;
134
135 &lt;div class=&quot;col-6&quot;&gt;
136
137 &lt;center&gt;
138 &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;h…
139 &lt;/center&gt;
140
141 &lt;/div&gt;
142
143 &lt;p&gt;&lt;/div&gt;&lt;/p&gt;
144
145 &lt;h2&gt;What are bit prefixes?&lt;/h2&gt;
146
147 &lt;p&gt;Bit prefixes is a common technique that allows for encoding inf…
148
149 &lt;p&gt;&lt;strong&gt;Bit prefixing is useful to maximize the extra spa…
150
151 &lt;p&gt;In the case of UTF-8 the shortest prefixes are &lt;code&gt;0&lt…
152
153 &lt;p&gt;Looking at the prefixes for UTF-8 octets the possibilities are …
154
155 &lt;div class=&quot;row&quot;&gt;
156 &lt;div class=&quot;col-6&quot;&gt;
157
158 &lt;h2&gt;Following the flow of bits&lt;/h2&gt;
159
160 &lt;p&gt;Using Python we're able to see that our target output is &lt;co…
161
162 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
163 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
164 &lt;span class=&quot;sa&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;s1&q…
165 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
166
167 &lt;p&gt;
168 Encoding a Unicode codepoint into bytes is a multi-step process. The fir…
169 &lt;/p&gt;
170
171 &lt;p&gt;
172 Next step is converting the codepoint value &lt;code&gt;0x1F602&lt;/code…
173 &lt;/p&gt;
174
175 &lt;/div&gt;
176
177 &lt;div class=&quot;col-6&quot;&gt;
178
179 &lt;center&gt;
180 &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;h…
181
182 &lt;/div&gt;
183
184 &lt;p&gt;&lt;/div&gt;&lt;/p&gt;
185
186 &lt;p&gt;From there we lay out our four octets, 1 header and 3 tail octe…
187
188 &lt;p&gt;After that we turn each 8 bit grouping into a byte which we dis…
189
190 &lt;p&gt;Decoding a Unicode codepoint from bytes only requires reversing…
191
192 &lt;blockquote&gt;
193 &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; You can always find a code…
194 &lt;/blockquote&gt;
195
196 &lt;div class=&quot;row&quot;&gt;
197 &lt;div class=&quot;col-6&quot;&gt;
198
199 &lt;h2&gt;Why is UTF-8 everywhere?&lt;/h2&gt;
200
201 &lt;p&gt;
202 Back when UTF-8 was first introduced there were many systems that didn't…
203 &lt;/p&gt;
204
205 &lt;p&gt;
206 UTF-8's use of byte prefixing &lt;code&gt;0&lt;/code&gt; to be identical…
207 &lt;/p&gt;
208
209 &lt;p&gt;
210 This was a big win for compatibility as it &lt;strong&gt;meant many syst…
211 &lt;/p&gt;
212
213 &lt;/div&gt;
214
215 &lt;div class=&quot;col-6&quot;&gt;
216
217 &lt;center&gt;
218 &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;h…
219
220 &lt;/div&gt;
221
222 &lt;p&gt;&lt;/div&gt;&lt;/p&gt;
223
224 &lt;h2&gt;Giant reference card&lt;/h2&gt;
225
226 &lt;p&gt;Below is a diagram which shows how all the different possible h…
227
228 &lt;p&gt;Grapheme clusters are mentioned in the diagram, simply put they…
229
230 &lt;p&gt;&lt;center&gt;
231 &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;h…
232 &lt;/center&gt;&lt;/p&gt;
233
234 &lt;/div&gt;
235 &lt;/div&gt;
236 &lt;div class=&quot;row&quot;&gt;
237 &lt;div class=&quot;col-12&quot;&gt;
238 &lt;center&gt;
239 &lt;div class=&quot;how-to-subscribe&quot;&gt;
240 Enjoy this post? &lt;span class=&quot;heart&quot;&gt;❀&amp…
241 &lt;/div&gt;
242 &lt;/center&gt;
243 &lt;/div&gt;
244 &lt;/div&gt;
245
246 &lt;div class=&quot;row&quot;&gt;
247 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
248 &lt;div class=&quot;col-8&quot;&gt;&lt;center&gt;&lt;small&g…
249 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
250 &lt;/div&gt;
251 &lt;/div&gt;
252
253 &lt;!-- Google Analytics --&gt;
254 &lt;script async src=&quot;https://www.googletagmanager.com/gtag/js?id=G…
255 &lt;script&gt;
256 window.dataLayer = window.dataLayer || [];
257 function gtag(){dataLayer.push(arguments);}
258 gtag('js', new Date());
259 gtag('config', 'G-C3VD7T243W');
260 &lt;/script&gt;
261 &lt;/body&gt;
262 &lt;/html&gt;</content>
263 </entry>
264 <entry xml:base="http://sethmlarson.dev/feed">
265 <title type="text">Strict Python function parameters</title>
266 <id>http://sethmlarson.dev/blog/strict-python-function-parameters?da…
267 <updated>2022-01-23T00:00:00Z</updated>
268 <published>2022-01-23T00:00:00Z</published>
269 <link href="http://sethmlarson.dev/blog/strict-python-function-param…
270 <author>
271 <name>Seth Michael Larson</name>
272 </author>
273 <content type="html">&lt;!DOCTYPE html&gt;
274 &lt;html lang=&quot;en&quot;&gt;
275 &lt;head&gt;
276 &lt;meta charset=&quot;utf-8&quot;&gt;
277 &lt;title&gt;Strict Python function parameters&lt;/title&gt;
278 &lt;meta name=&quot;description&quot; content=&quot;Blogging about P…
279 &lt;meta name=&quot;keywords&quot; content=&quot;blog python open so…
280 &lt;meta name=&quot;author&quot; content=&quot;Seth Michael Larson&q…
281 &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,…
282 &lt;meta name=&quot;format-detection&quot; content=&quot;telephone=n…
283 &lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&qu…
284 &lt;link rel=&quot;icon&quot; href=&quot;/static/favicon.ico&quot;&g…
285 &lt;link rel=&quot;stylesheet&quot; href=&quot;/static/style.css&quo…
286
287 &lt;meta property=&quot;og:site_name&quot; content=&quot;Seth Michae…
288 &lt;meta property=&quot;og:author&quot; content=&quot;Seth Michael L…
289 &lt;meta property=&quot;og:type&quot; content=&quot;article&quot;/&g…
290 &lt;meta property=&quot;og:title&quot; content=&quot;Strict Python f…
291 &lt;meta property=&quot;og:description&quot; content=&quot;What do y…
292 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
293 &lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;/&…
294 &lt;meta name=&quot;twitter:site&quot; content=&quot;@sethmlarson&qu…
295 &lt;meta name=&quot;twitter:creator&quot; content=&quot;@sethmlarson…
296 &lt;meta name=&quot;twitter:title&quot; content=&quot;Strict Python …
297 &lt;meta name=&quot;twitter:description&quot; content=&quot;What do …
298 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
299
300 &lt;/head&gt;
301 &lt;body&gt;
302 &lt;div class=&quot;container&quot;&gt;
303 &lt;div class=&quot;row&quot;&gt;
304 &lt;div class=&quot;col-6&quot;&gt;
305 &lt;center&gt;
306 &lt;h1 style=&quot;margin-bottom: 0.1em; font-size: 1.8e…
307 &lt;span style=&quot;font-style: italic;&quot;&gt;Bloggi…
308 &lt;/center&gt;
309 &lt;/div&gt;
310 &lt;div class=&quot;col-6&quot;&gt;
311 &lt;div class=&quot;navbar-outer&quot;&gt;
312 &lt;div class=&quot;navbar-inner&quot;&gt;
313 &lt;a class=&quot;icon&quot; href=&quot;/about&quot;…
314 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
315 &lt;title&gt;About&lt;/title&gt;&lt;path d=&…
316 &lt;/svg&gt;
317 &lt;/a&gt;
318 &lt;a class=&quot;icon&quot; href=&quot;/blog&quot;&…
319 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
320 &lt;title&gt;Blog&lt;/title&gt;&lt;path d=&q…
321 &lt;/svg&gt;
322 &lt;/a&gt;
323 &lt;a class=&quot;icon&quot; href=&quot;https://twit…
324 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
325 &lt;title&gt;Twitter&lt;/title&gt;&lt;path d…
326 &lt;/svg&gt;
327 &lt;/a&gt;
328 &lt;a class=&quot;icon&quot; href=&quot;https://gith…
329 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
330 &lt;title&gt;GitHub&lt;/title&gt;&lt;path d=…
331 &lt;/svg&gt;
332 &lt;/a&gt;
333 &lt;a class=&quot;icon&quot; href=&quot;https://link…
334 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
335 &lt;title&gt;LinkedIn&lt;/title&gt;&lt;path …
336 &lt;/svg&gt;
337 &lt;/a&gt;
338 &lt;/div&gt;
339 &lt;/div&gt;
340 &lt;/div&gt;
341 &lt;/div&gt;
342
343 &lt;div class=&quot;row&quot;&gt;
344 &lt;div class=&quot;col-12&quot;&gt;
345 &lt;h2 class=&quot;blog-title&quot; style=&quot;text-align: cent…
346 &lt;p&gt;&lt;center&gt;Published 2022-01-23 β€” &lt;span class=&…
347 &lt;/div&gt;
348 &lt;/div&gt;
349 &lt;div class=&quot;row&quot;&gt;
350 &lt;div class=&quot;col-12&quot;&gt;
351 &lt;p&gt;&lt;strong&gt;What do you think about when writing a ne…
352
353 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
354 &lt;span class=&quot;c1&quot;&gt;# Fancy data processing here!&lt;/sp…
355 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
356
357 &lt;p&gt;However, there's one aspect many programmers have an opinion ab…
358
359 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
360
361 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
362 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
363
364 &lt;p&gt;You don't need to specify &lt;code&gt;data=&lt;/code&gt; for re…
365
366 &lt;p&gt;The above decisions make sense to me having written lots of Pyt…
367
368 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
369 &lt;span class=&quot;c1&quot;&gt;# infer the parameter for &amp;#39;utf-…
370 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
371
372 &lt;span class=&quot;c1&quot;&gt;# Using `data` as keyword argument, but…
373 &lt;span class=&quot;c1&quot;&gt;# not as clean as &amp;quot;data&amp;qu…
374 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
375 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
376
377 &lt;span class=&quot;c1&quot;&gt;# All keyword parameters but encoding&l…
378 &lt;span class=&quot;c1&quot;&gt;# and data are flip-flopped.&lt;/span&g…
379 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
380 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
381
382 &lt;p&gt;If the code is widespread enough you're almost guaranteed that …
383
384 &lt;h2&gt;Keyword-only parameters&lt;/h2&gt;
385
386 &lt;p&gt;&lt;a href=&quot;https://www.python.org/dev/peps/pep-3102&quot;…
387
388 &lt;p&gt;Defining a parameter as being &quot;keyword-only&quot; looks li…
389
390 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
391 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
392
393 &lt;p&gt;Notice the &lt;code&gt;*&lt;/code&gt; between &lt;code&gt;data&…
394
395 &lt;p&gt;Now that the &lt;code&gt;encoding&lt;/code&gt; parameter is a k…
396
397 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
398 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
399 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
400
401 &lt;span class=&quot;c1&quot;&gt;# Raises a TypeError:&lt;/span&gt;
402 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
403
404 &lt;span class=&quot;c1&quot;&gt;# What way can (and will) use the funct…
405 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
406 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
407 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
408 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
409
410 &lt;p&gt;It's a small improvement but there's more we can do!&lt;/p&gt;
411
412 &lt;h2&gt;Positional-only parameters&lt;/h2&gt;
413
414 &lt;p&gt;&lt;a href=&quot;https://www.python.org/dev/peps/pep-0570&quot;…
415
416 &lt;p&gt;You can define &quot;positional-only&quot; argument in Python l…
417
418 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
419 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
420
421 &lt;p&gt;The &lt;code&gt;/&lt;/code&gt; in the function signature means …
422
423 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
424 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
425 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
426
427 &lt;p&gt;Many functions in the standard library don't follow the typical…
428
429 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
430 &lt;span class=&quot;c1&quot;&gt;# the `/` character even before Python&…
431 &lt;span class=&quot;c1&quot;&gt;# 3.8 implemented PEP 570:&lt;/span&gt;
432 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
433 &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
434 &lt;span class=&quot;nb&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;p&…
435 &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
436
437 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
438 &lt;span class=&quot;n&quot;&gt;Traceback&lt;/span&gt; &lt;span class=&q…
439 &lt;span class=&quot;n&quot;&gt;File&lt;/span&gt; &lt;span class=&quot…
440 &lt;span class=&quot;ne&quot;&gt;TypeError&lt;/span&gt;&lt;span class=&q…
441 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
442
443 &lt;h2&gt;Putting it all together&lt;/h2&gt;
444
445 &lt;p&gt;You can use both positional-only and keyword-only arguments tog…
446
447 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
448 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
449
450 &lt;p&gt;And now with &lt;code&gt;data&lt;/code&gt; being positional-onl…
451
452 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
453 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
454 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
455
456 &lt;span class=&quot;c1&quot;&gt;# Raises a TypeError:&lt;/span&gt;
457 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
458 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
459 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
460 &lt;span class=&quot;n&quot;&gt;process_data&lt;/span&gt;&lt;span class=…
461 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
462
463 &lt;p&gt;&lt;strong&gt;Success!!&lt;/strong&gt; πŸŽ‰ Your function now o…
464
465 &lt;h2&gt;Why use strict function signatures?&lt;/h2&gt;
466
467 &lt;p&gt;So why go through this extra bit of trouble? You could read the…
468
469 &lt;h3&gt;Less to consider when your function changes&lt;/h3&gt;
470
471 &lt;p&gt;Here's a real-life example I had to handle with the &lt;a href=…
472
473 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
474 &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf…
475
476 &lt;span class=&quot;c1&quot;&gt;# Function signature in v8.0.0&lt;/span…
477 &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf…
478 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
479
480 &lt;p&gt;If the &lt;code&gt;doc_type&lt;/code&gt; parameter were removed…
481
482 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
483
484 &lt;span class=&quot;c1&quot;&gt;# In 7.16.0 the above arguments will&lt…
485 &lt;span class=&quot;c1&quot;&gt;# be assigned like so:&lt;/span&gt;
486
487 &lt;span class=&quot;c1&quot;&gt;# {index=1, id=2, doc_type=3}&lt;/span&…
488
489 &lt;span class=&quot;c1&quot;&gt;# In 8.0.0 (if not mitigated) the above…
490 &lt;span class=&quot;c1&quot;&gt;# arguments would be assigned like so:&…
491
492 &lt;span class=&quot;c1&quot;&gt;# {index=1, id=2, params=3} (not good!)…
493 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
494
495 &lt;p&gt;We started emitting a &lt;code&gt;DeprecationWarning&lt;/code&g…
496
497 &lt;p&gt;This change also meant the API generator logic could be greatly…
498
499 &lt;p&gt;&lt;strong&gt;There's additional API freedoms when using positi…
500
501 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
502 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
503
504 &lt;p&gt;If you now wanted the &lt;code&gt;data&lt;/code&gt; parameter t…
505
506 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
507 &lt;span class=&quot;c1&quot;&gt;# without breaking anyone&amp;#39;s cod…
508 &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf…
509 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
510
511 &lt;p&gt;For more information there's an &lt;a href=&quot;https://www.py…
512
513 &lt;h3&gt;Consistency between documentation and usage&lt;/h3&gt;
514
515 &lt;p&gt;Ideally documentation will pick a single way of using each func…
516
517 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
518 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
519
520 &lt;p&gt;This function is found &lt;em&gt;everywhere&lt;/em&gt;, even ac…
521
522 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
523 &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot…
524
525 &lt;span class=&quot;c1&quot;&gt;# These aren&amp;#39;t as immediately r…
526 &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot…
527 &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot…
528 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
529
530 &lt;p&gt;By having a strict function signature we can ensure code writte…
531
532 &lt;/div&gt;
533 &lt;/div&gt;
534 &lt;div class=&quot;row&quot;&gt;
535 &lt;div class=&quot;col-12&quot;&gt;
536 &lt;center&gt;
537 &lt;div class=&quot;how-to-subscribe&quot;&gt;
538 Enjoy this post? &lt;span class=&quot;heart&quot;&gt;❀&amp…
539 &lt;/div&gt;
540 &lt;/center&gt;
541 &lt;/div&gt;
542 &lt;/div&gt;
543
544 &lt;div class=&quot;row&quot;&gt;
545 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
546 &lt;div class=&quot;col-8&quot;&gt;&lt;center&gt;&lt;small&g…
547 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
548 &lt;/div&gt;
549 &lt;/div&gt;
550
551 &lt;!-- Google Analytics --&gt;
552 &lt;script async src=&quot;https://www.googletagmanager.com/gtag/js?id=G…
553 &lt;script&gt;
554 window.dataLayer = window.dataLayer || [];
555 function gtag(){dataLayer.push(arguments);}
556 gtag('js', new Date());
557 gtag('config', 'G-C3VD7T243W');
558 &lt;/script&gt;
559 &lt;/body&gt;
560 &lt;/html&gt;</content>
561 </entry>
562 <entry xml:base="http://sethmlarson.dev/feed">
563 <title type="text">Problems with testing Python pre-releases and pip…
564 <id>http://sethmlarson.dev/blog/python-prereleases-and-pip-cache?dat…
565 <updated>2022-01-13T00:00:00Z</updated>
566 <published>2022-01-13T00:00:00Z</published>
567 <link href="http://sethmlarson.dev/blog/python-prereleases-and-pip-c…
568 <author>
569 <name>Seth Michael Larson</name>
570 </author>
571 <content type="html">&lt;!DOCTYPE html&gt;
572 &lt;html lang=&quot;en&quot;&gt;
573 &lt;head&gt;
574 &lt;meta charset=&quot;utf-8&quot;&gt;
575 &lt;title&gt;Problems with testing Python pre-releases and pip cachi…
576 &lt;meta name=&quot;description&quot; content=&quot;Blogging about P…
577 &lt;meta name=&quot;keywords&quot; content=&quot;blog python open so…
578 &lt;meta name=&quot;author&quot; content=&quot;Seth Michael Larson&q…
579 &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,…
580 &lt;meta name=&quot;format-detection&quot; content=&quot;telephone=n…
581 &lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&qu…
582 &lt;link rel=&quot;icon&quot; href=&quot;/static/favicon.ico&quot;&g…
583 &lt;link rel=&quot;stylesheet&quot; href=&quot;/static/style.css&quo…
584
585 &lt;meta property=&quot;og:site_name&quot; content=&quot;Seth Michae…
586 &lt;meta property=&quot;og:author&quot; content=&quot;Seth Michael L…
587 &lt;meta property=&quot;og:type&quot; content=&quot;article&quot;/&g…
588 &lt;meta property=&quot;og:title&quot; content=&quot;Problems with t…
589 &lt;meta property=&quot;og:description&quot; content=&quot;Some time…
590
591 nox &amp;amp;gt; Running session test-3.11
592 nox &amp;amp;gt; Cre...&quot;/&gt;
593 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
594 &lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;/&…
595 &lt;meta name=&quot;twitter:site&quot; content=&quot;@sethmlarson&qu…
596 &lt;meta name=&quot;twitter:creator&quot; content=&quot;@sethmlarson…
597 &lt;meta name=&quot;twitter:title&quot; content=&quot;Problems with …
598 &lt;meta name=&quot;twitter:description&quot; content=&quot;Some tim…
599
600 nox &amp;amp;gt; Running session test-3.11
601 nox &amp;amp;gt; Cre...&quot;/&gt;
602 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
603
604 &lt;/head&gt;
605 &lt;body&gt;
606 &lt;div class=&quot;container&quot;&gt;
607 &lt;div class=&quot;row&quot;&gt;
608 &lt;div class=&quot;col-6&quot;&gt;
609 &lt;center&gt;
610 &lt;h1 style=&quot;margin-bottom: 0.1em; font-size: 1.8e…
611 &lt;span style=&quot;font-style: italic;&quot;&gt;Bloggi…
612 &lt;/center&gt;
613 &lt;/div&gt;
614 &lt;div class=&quot;col-6&quot;&gt;
615 &lt;div class=&quot;navbar-outer&quot;&gt;
616 &lt;div class=&quot;navbar-inner&quot;&gt;
617 &lt;a class=&quot;icon&quot; href=&quot;/about&quot;…
618 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
619 &lt;title&gt;About&lt;/title&gt;&lt;path d=&…
620 &lt;/svg&gt;
621 &lt;/a&gt;
622 &lt;a class=&quot;icon&quot; href=&quot;/blog&quot;&…
623 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
624 &lt;title&gt;Blog&lt;/title&gt;&lt;path d=&q…
625 &lt;/svg&gt;
626 &lt;/a&gt;
627 &lt;a class=&quot;icon&quot; href=&quot;https://twit…
628 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
629 &lt;title&gt;Twitter&lt;/title&gt;&lt;path d…
630 &lt;/svg&gt;
631 &lt;/a&gt;
632 &lt;a class=&quot;icon&quot; href=&quot;https://gith…
633 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
634 &lt;title&gt;GitHub&lt;/title&gt;&lt;path d=…
635 &lt;/svg&gt;
636 &lt;/a&gt;
637 &lt;a class=&quot;icon&quot; href=&quot;https://link…
638 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
639 &lt;title&gt;LinkedIn&lt;/title&gt;&lt;path …
640 &lt;/svg&gt;
641 &lt;/a&gt;
642 &lt;/div&gt;
643 &lt;/div&gt;
644 &lt;/div&gt;
645 &lt;/div&gt;
646
647 &lt;div class=&quot;row&quot;&gt;
648 &lt;div class=&quot;col-12&quot;&gt;
649 &lt;h2 class=&quot;blog-title&quot; style=&quot;text-align: cent…
650 &lt;p&gt;&lt;center&gt;Published 2022-01-13 β€” &lt;span class=&…
651 &lt;/div&gt;
652 &lt;/div&gt;
653 &lt;div class=&quot;row&quot;&gt;
654 &lt;div class=&quot;col-12&quot;&gt;
655 &lt;p&gt;Some time ago the urllib3 team noticed that our Python …
656
657 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
658 nox &amp;gt; Creating virtual environment &lt;span class=&quot;o&quot;&g…
659 nox &amp;gt; python --version
660 Python &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;.11.0a3
661 nox &amp;gt; Command coverage run --parallel-mode -m pytest -r a
662 --color&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;yes --tb&lt;span …
663 failed with &lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt; code -11
664
665 nox &amp;gt; Session test-3.11 failed.
666 Error: Process completed with &lt;span class=&quot;nb&quot;&gt;exit&lt;/…
667 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
668
669 &lt;p&gt;Notice that our test execution was exited with a return code of…
670
671 &lt;p&gt;&lt;a href=&quot;https://github.com/pquentin&quot;&gt;Quentin&l…
672
673 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
674
675 Thread 0x00007fee9a250640 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;…
676 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/install/lib/pyth…
677 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/urllib3/venv/lib…
678 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/urllib3/venv/lib…
679 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/urllib3/venv/lib…
680 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/urllib3/venv/lib…
681 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/install/lib/pyth…
682 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/install/lib/pyth…
683 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/install/lib/pyth…
684 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/urllib3/venv/lib…
685 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/install/lib/pyth…
686 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/install/lib/pyth…
687 File &lt;span class=&quot;s2&quot;&gt;&amp;quot;/home/install/lib/pyth…
688
689 Extension modules: tornado.speedups, _brotli, _cffi_backend &lt;span cla…
690 zsh: segmentation fault &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;co…
691 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
692
693 &lt;p&gt;This looks like an issue in CPython, but we'll eventually disco…
694
695 &lt;h2&gt;Finding and reporting the &quot;bug&quot;&lt;/h2&gt;
696
697 &lt;p&gt;After we could reproduce the error reliably, Quentin started &l…
698
699 &lt;p&gt;Within this issue &lt;a href=&quot;https://github.com/ericsnowc…
700
701 &lt;blockquote&gt;
702 &lt;p&gt;Could it be that the wheel for one or more the dependencies w…
703 &lt;/blockquote&gt;
704
705 &lt;p&gt;&lt;strong&gt;The answer to this was yes!&lt;/strong&gt; Pip wa…
706
707 &lt;h2&gt;When should you be testing Python pre-releases?&lt;/h2&gt;
708
709 &lt;p&gt;Testing your code against pre-releases of Python is important t…
710
711 &lt;p&gt;Eric noted in the issue we filed:&lt;/p&gt;
712
713 &lt;blockquote&gt;
714 &lt;p&gt;Thanks for testing against the alpha releases!!! You're havi…
715 &lt;/blockquote&gt;
716
717 &lt;p&gt;However, doing so super early on in the development cycle of a …
718
719 &lt;p&gt;If you maintain a Python library you should try at least to man…
720
721 &lt;p&gt;The urllib3 team tries to start testing against in-development …
722
723 &lt;h3&gt;When should you be aware of ABI changes?&lt;/h3&gt;
724
725 &lt;p&gt;Unless you're testing alpha and beta releases you likely won't …
726
727 &lt;h2&gt;What are we doing to make this better?&lt;/h2&gt;
728
729 &lt;p&gt;Our team was using the &lt;a href=&quot;https://github.com/acti…
730
731 &lt;p&gt;We knew that pip's cache shouldn't be re-used across, at a mini…
732
733 &lt;p&gt;A &quot;cache key&quot; is the identifier that the setup-python…
734
735 &lt;/div&gt;
736 &lt;/div&gt;
737 &lt;div class=&quot;row&quot;&gt;
738 &lt;div class=&quot;col-12&quot;&gt;
739 &lt;center&gt;
740 &lt;div class=&quot;how-to-subscribe&quot;&gt;
741 Enjoy this post? &lt;span class=&quot;heart&quot;&gt;❀&amp…
742 &lt;/div&gt;
743 &lt;/center&gt;
744 &lt;/div&gt;
745 &lt;/div&gt;
746
747 &lt;div class=&quot;row&quot;&gt;
748 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
749 &lt;div class=&quot;col-8&quot;&gt;&lt;center&gt;&lt;small&g…
750 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
751 &lt;/div&gt;
752 &lt;/div&gt;
753
754 &lt;!-- Google Analytics --&gt;
755 &lt;script async src=&quot;https://www.googletagmanager.com/gtag/js?id=G…
756 &lt;script&gt;
757 window.dataLayer = window.dataLayer || [];
758 function gtag(){dataLayer.push(arguments);}
759 gtag('js', new Date());
760 gtag('config', 'G-C3VD7T243W');
761 &lt;/script&gt;
762 &lt;/body&gt;
763 &lt;/html&gt;</content>
764 </entry>
765 <entry xml:base="http://sethmlarson.dev/feed">
766 <title type="text">urllib3 raised $15,000 in 2021 (Newsletter #6)</t…
767 <id>http://sethmlarson.dev/blog/urllib3-raised-15k-in-2021?date=2021…
768 <updated>2021-12-29T00:00:00Z</updated>
769 <published>2021-12-29T00:00:00Z</published>
770 <link href="http://sethmlarson.dev/blog/urllib3-raised-15k-in-2021?d…
771 <author>
772 <name>Seth Michael Larson</name>
773 </author>
774 <content type="html">&lt;!DOCTYPE html&gt;
775 &lt;html lang=&quot;en&quot;&gt;
776 &lt;head&gt;
777 &lt;meta charset=&quot;utf-8&quot;&gt;
778 &lt;title&gt;urllib3 raised $15,000 in 2021 (Newsletter #6)&lt;/titl…
779 &lt;meta name=&quot;description&quot; content=&quot;Blogging about P…
780 &lt;meta name=&quot;keywords&quot; content=&quot;blog python open so…
781 &lt;meta name=&quot;author&quot; content=&quot;Seth Michael Larson&q…
782 &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,…
783 &lt;meta name=&quot;format-detection&quot; content=&quot;telephone=n…
784 &lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&qu…
785 &lt;link rel=&quot;icon&quot; href=&quot;/static/favicon.ico&quot;&g…
786 &lt;link rel=&quot;stylesheet&quot; href=&quot;/static/style.css&quo…
787
788 &lt;meta property=&quot;og:site_name&quot; content=&quot;Seth Michae…
789 &lt;meta property=&quot;og:author&quot; content=&quot;Seth Michael L…
790 &lt;meta property=&quot;og:type&quot; content=&quot;article&quot;/&g…
791 &lt;meta property=&quot;og:title&quot; content=&quot;urllib3 raised …
792 &lt;meta property=&quot;og:description&quot; content=&quot;Welcome t…
793
794 Thanks to our sponsors!
795
796 This year we receiv...&quot;/&gt;
797 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
798 &lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;/&…
799 &lt;meta name=&quot;twitter:site&quot; content=&quot;@sethmlarson&qu…
800 &lt;meta name=&quot;twitter:creator&quot; content=&quot;@sethmlarson…
801 &lt;meta name=&quot;twitter:title&quot; content=&quot;urllib3 raised…
802 &lt;meta name=&quot;twitter:description&quot; content=&quot;Welcome …
803
804 Thanks to our sponsors!
805
806 This year we receiv...&quot;/&gt;
807 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
808
809 &lt;/head&gt;
810 &lt;body&gt;
811 &lt;div class=&quot;container&quot;&gt;
812 &lt;div class=&quot;row&quot;&gt;
813 &lt;div class=&quot;col-6&quot;&gt;
814 &lt;center&gt;
815 &lt;h1 style=&quot;margin-bottom: 0.1em; font-size: 1.8e…
816 &lt;span style=&quot;font-style: italic;&quot;&gt;Bloggi…
817 &lt;/center&gt;
818 &lt;/div&gt;
819 &lt;div class=&quot;col-6&quot;&gt;
820 &lt;div class=&quot;navbar-outer&quot;&gt;
821 &lt;div class=&quot;navbar-inner&quot;&gt;
822 &lt;a class=&quot;icon&quot; href=&quot;/about&quot;…
823 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
824 &lt;title&gt;About&lt;/title&gt;&lt;path d=&…
825 &lt;/svg&gt;
826 &lt;/a&gt;
827 &lt;a class=&quot;icon&quot; href=&quot;/blog&quot;&…
828 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
829 &lt;title&gt;Blog&lt;/title&gt;&lt;path d=&q…
830 &lt;/svg&gt;
831 &lt;/a&gt;
832 &lt;a class=&quot;icon&quot; href=&quot;https://twit…
833 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
834 &lt;title&gt;Twitter&lt;/title&gt;&lt;path d…
835 &lt;/svg&gt;
836 &lt;/a&gt;
837 &lt;a class=&quot;icon&quot; href=&quot;https://gith…
838 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
839 &lt;title&gt;GitHub&lt;/title&gt;&lt;path d=…
840 &lt;/svg&gt;
841 &lt;/a&gt;
842 &lt;a class=&quot;icon&quot; href=&quot;https://link…
843 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
844 &lt;title&gt;LinkedIn&lt;/title&gt;&lt;path …
845 &lt;/svg&gt;
846 &lt;/a&gt;
847 &lt;/div&gt;
848 &lt;/div&gt;
849 &lt;/div&gt;
850 &lt;/div&gt;
851
852 &lt;div class=&quot;row&quot;&gt;
853 &lt;div class=&quot;col-12&quot;&gt;
854 &lt;h2 class=&quot;blog-title&quot; style=&quot;text-align: cent…
855 &lt;p&gt;&lt;center&gt;Published 2021-12-29 β€” &lt;span class=&…
856 &lt;/div&gt;
857 &lt;/div&gt;
858 &lt;div class=&quot;row&quot;&gt;
859 &lt;div class=&quot;col-12&quot;&gt;
860 &lt;p&gt;Welcome to the 6th urllib3 newsletter, end of 2021 edit…
861
862 &lt;h2&gt;Thanks to our sponsors!&lt;/h2&gt;
863
864 &lt;p&gt;This year we received so much support from many different place…
865
866 &lt;p&gt;&lt;strong&gt;We're so thankful for everyone who contributed.&l…
867
868 &lt;p&gt;This large amount of funding means our team is planning on sett…
869
870 &lt;h3&gt;Where we received and spent our funding&lt;/h3&gt;
871
872 &lt;p&gt;All of these amounts shown below are after fees from payment pr…
873
874 &lt;ul&gt;
875 &lt;li&gt;$8,087.38 from &lt;a href=&quot;https://gitcoin.co/grants/65/u…
876 &lt;li&gt;$5,050.00 from &lt;a href=&quot;https://tidelift.com/subscript…
877 &lt;li&gt;$1,358.97 from &lt;a href=&quot;https://github.com/sponsors/ur…
878 &lt;li&gt;$504.00 from &lt;a href=&quot;https://opencollective.com/urlli…
879 &lt;li&gt;&lt;strong&gt;$15,000.35&lt;/strong&gt; from all sources&lt;/l…
880 &lt;/ul&gt;
881
882 &lt;p&gt;Funds were paid out to the following individuals:&lt;/p&gt;
883
884 &lt;ul&gt;
885 &lt;li&gt;$4,075 paid to &lt;a href=&quot;https://github.com/sethmlarson…
886 &lt;li&gt;$3,325 paid to &lt;a href=&quot;https://github.com/pquentin&qu…
887 &lt;li&gt;$1,900 paid to &lt;a href=&quot;https://github.com/hramezani&q…
888 &lt;li&gt;$140 paid to &lt;a href=&quot;https://github.com/davidism&quot…
889 &lt;li&gt;&lt;strong&gt;$9,440&lt;/strong&gt; paid in total&lt;/li&gt;
890 &lt;/ul&gt;
891
892 &lt;p&gt;ΒΉ Amount from GitCoin is only ETH, DAI, and USDC that were sol…
893
894 &lt;p&gt;Β² Tidelift is paid directly to Seth Larson and Quentin Pradet …
895
896 &lt;h2&gt;Releases and Contributors&lt;/h2&gt;
897
898 &lt;p&gt;There were &lt;a href=&quot;https://github.com/urllib3/urllib3/…
899
900 &lt;h2&gt;Progress towards v2.0&lt;/h2&gt;
901
902 &lt;p&gt;The &lt;a href=&quot;https://github.com/urllib3/urllib3/milesto…
903
904 &lt;p&gt;Even after v2.0 is released our team plans on continuing bug fi…
905
906 &lt;h2&gt;Type hints case study&lt;/h2&gt;
907
908 &lt;p&gt;&lt;a href=&quot;https://github.com/hramezani&quot;&gt;Hasan Ra…
909
910 &lt;h2&gt;Unreasonable effectiveness of investing in open source&lt;/h2&…
911
912 &lt;p&gt;Quentin Pradet was &lt;a href=&quot;https://quentin.pradet.me/b…
913
914 &lt;h2&gt;PyCascades 2021&lt;/h2&gt;
915
916 &lt;p&gt;Seth spoke at &lt;a href=&quot;https://2021.pycascades.com/&quo…
917
918 &lt;/div&gt;
919 &lt;/div&gt;
920 &lt;div class=&quot;row&quot;&gt;
921 &lt;div class=&quot;col-12&quot;&gt;
922 &lt;center&gt;
923 &lt;div class=&quot;how-to-subscribe&quot;&gt;
924 Enjoy this post? &lt;span class=&quot;heart&quot;&gt;❀&amp…
925 &lt;/div&gt;
926 &lt;/center&gt;
927 &lt;/div&gt;
928 &lt;/div&gt;
929
930 &lt;div class=&quot;row&quot;&gt;
931 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
932 &lt;div class=&quot;col-8&quot;&gt;&lt;center&gt;&lt;small&g…
933 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
934 &lt;/div&gt;
935 &lt;/div&gt;
936
937 &lt;!-- Google Analytics --&gt;
938 &lt;script async src=&quot;https://www.googletagmanager.com/gtag/js?id=G…
939 &lt;script&gt;
940 window.dataLayer = window.dataLayer || [];
941 function gtag(){dataLayer.push(arguments);}
942 gtag('js', new Date());
943 gtag('config', 'G-C3VD7T243W');
944 &lt;/script&gt;
945 &lt;/body&gt;
946 &lt;/html&gt;</content>
947 </entry>
948 <entry xml:base="http://sethmlarson.dev/feed">
949 <title type="text">Experimental APIs in Python 3.10 and the future o…
950 <id>http://sethmlarson.dev/blog/experimental-python-3.10-apis-and-tr…
951 <updated>2021-11-27T00:00:00Z</updated>
952 <published>2021-11-27T00:00:00Z</published>
953 <link href="http://sethmlarson.dev/blog/experimental-python-3.10-api…
954 <author>
955 <name>Seth Michael Larson</name>
956 </author>
957 <content type="html">&lt;!DOCTYPE html&gt;
958 &lt;html lang=&quot;en&quot;&gt;
959 &lt;head&gt;
960 &lt;meta charset=&quot;utf-8&quot;&gt;
961 &lt;title&gt;Experimental APIs in Python 3.10 and the future of trus…
962 &lt;meta name=&quot;description&quot; content=&quot;Blogging about P…
963 &lt;meta name=&quot;keywords&quot; content=&quot;blog python open so…
964 &lt;meta name=&quot;author&quot; content=&quot;Seth Michael Larson&q…
965 &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,…
966 &lt;meta name=&quot;format-detection&quot; content=&quot;telephone=n…
967 &lt;link rel=&quot;alternate&quot; type=&quot;application/rss+xml&qu…
968 &lt;link rel=&quot;icon&quot; href=&quot;/static/favicon.ico&quot;&g…
969 &lt;link rel=&quot;stylesheet&quot; href=&quot;/static/style.css&quo…
970
971 &lt;meta property=&quot;og:site_name&quot; content=&quot;Seth Michae…
972 &lt;meta property=&quot;og:author&quot; content=&quot;Seth Michael L…
973 &lt;meta property=&quot;og:type&quot; content=&quot;article&quot;/&g…
974 &lt;meta property=&quot;og:title&quot; content=&quot;Experimental AP…
975 &lt;meta property=&quot;og:description&quot; content=&quot;⚠️ Th…
976
977 In Python 3.10.0 there were a few new APIs...&quot;/&gt;
978 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
979 &lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;/&…
980 &lt;meta name=&quot;twitter:site&quot; content=&quot;@sethmlarson&qu…
981 &lt;meta name=&quot;twitter:creator&quot; content=&quot;@sethmlarson…
982 &lt;meta name=&quot;twitter:title&quot; content=&quot;Experimental A…
983 &lt;meta name=&quot;twitter:description&quot; content=&quot;⚠️ T…
984
985 In Python 3.10.0 there were a few new APIs...&quot;/&gt;
986 &lt;meta property=&quot;og:image&quot; content=&quot;http://sethmlar…
987
988 &lt;/head&gt;
989 &lt;body&gt;
990 &lt;div class=&quot;container&quot;&gt;
991 &lt;div class=&quot;row&quot;&gt;
992 &lt;div class=&quot;col-6&quot;&gt;
993 &lt;center&gt;
994 &lt;h1 style=&quot;margin-bottom: 0.1em; font-size: 1.8e…
995 &lt;span style=&quot;font-style: italic;&quot;&gt;Bloggi…
996 &lt;/center&gt;
997 &lt;/div&gt;
998 &lt;div class=&quot;col-6&quot;&gt;
999 &lt;div class=&quot;navbar-outer&quot;&gt;
1000 &lt;div class=&quot;navbar-inner&quot;&gt;
1001 &lt;a class=&quot;icon&quot; href=&quot;/about&quot;…
1002 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
1003 &lt;title&gt;About&lt;/title&gt;&lt;path d=&…
1004 &lt;/svg&gt;
1005 &lt;/a&gt;
1006 &lt;a class=&quot;icon&quot; href=&quot;/blog&quot;&…
1007 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
1008 &lt;title&gt;Blog&lt;/title&gt;&lt;path d=&q…
1009 &lt;/svg&gt;
1010 &lt;/a&gt;
1011 &lt;a class=&quot;icon&quot; href=&quot;https://twit…
1012 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
1013 &lt;title&gt;Twitter&lt;/title&gt;&lt;path d…
1014 &lt;/svg&gt;
1015 &lt;/a&gt;
1016 &lt;a class=&quot;icon&quot; href=&quot;https://gith…
1017 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
1018 &lt;title&gt;GitHub&lt;/title&gt;&lt;path d=…
1019 &lt;/svg&gt;
1020 &lt;/a&gt;
1021 &lt;a class=&quot;icon&quot; href=&quot;https://link…
1022 &lt;svg width=&quot;2em&quot; height=&quot;2em&q…
1023 &lt;title&gt;LinkedIn&lt;/title&gt;&lt;path …
1024 &lt;/svg&gt;
1025 &lt;/a&gt;
1026 &lt;/div&gt;
1027 &lt;/div&gt;
1028 &lt;/div&gt;
1029 &lt;/div&gt;
1030
1031 &lt;div class=&quot;row&quot;&gt;
1032 &lt;div class=&quot;col-12&quot;&gt;
1033 &lt;h2 class=&quot;blog-title&quot; style=&quot;text-align: cent…
1034 &lt;p&gt;&lt;center&gt;Published 2021-11-27 β€” &lt;span class=&…
1035 &lt;/div&gt;
1036 &lt;/div&gt;
1037 &lt;div class=&quot;row&quot;&gt;
1038 &lt;div class=&quot;col-12&quot;&gt;
1039 &lt;p&gt;&lt;strong&gt;⚠️ The APIs mentioned below aren't do…
1040
1041 &lt;p&gt;In Python 3.10.0 there were a few new APIs added to the &lt;cod…
1042
1043 &lt;p&gt;Let's see the new APIs in action and how their addition could m…
1044
1045 &lt;h2&gt;Using the new APIs&lt;/h2&gt;
1046
1047 &lt;p&gt;To see these APIs in action let's create a typical TLS connecti…
1048
1049 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
1050 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1051 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
1052 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1053 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1054 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1055 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
1056 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1057 &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quo…
1058 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
1059
1060 &lt;p&gt;Nothing out of the ordinary here yet. Now having looked at the …
1061
1062 &lt;p&gt;But we can access the internal &lt;code&gt;SSLObject&lt;/code&g…
1063
1064 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
1065 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1066 &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quo…
1067 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
1068
1069 &lt;p&gt;From here we can start poking around with the new certificate A…
1070
1071 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
1072
1073 &lt;span class=&quot;n&quot;&gt;_ssl&lt;/span&gt;&lt;span class=&quot;o&…
1074 &lt;span class=&quot;n&quot;&gt;_ssl&lt;/span&gt;&lt;span class=&quot;o&…
1075
1076 &lt;span class=&quot;n&quot;&gt;_ssl&lt;/span&gt;&lt;span class=&quot;o&…
1077
1078 &lt;span class=&quot;c1&quot;&gt;# see: SSLSocket.getpeercert(binary_for…
1079 &lt;span class=&quot;n&quot;&gt;_ssl&lt;/span&gt;&lt;span class=&quot;o&…
1080
1081 &lt;span class=&quot;c1&quot;&gt;# see: SSLSocket.getpeercert(binary_fo…
1082 &lt;span class=&quot;n&quot;&gt;_ssl&lt;/span&gt;&lt;span class=&quot;o&…
1083
1084 &lt;span class=&quot;n&quot;&gt;ssl&lt;/span&gt;&lt;span class=&quot;o&q…
1085 &lt;span class=&quot;n&quot;&gt;ssl&lt;/span&gt;&lt;span class=&quot;o&q…
1086 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
1087
1088 &lt;p&gt;If we try using these APIs we can get the following information…
1089
1090 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
1091 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1092
1093 &lt;span class=&quot;c1&quot;&gt;# In our case, the &amp;#39;unverified_…
1094 &lt;span class=&quot;c1&quot;&gt;# are the same we&amp;#39;ll discuss th…
1095 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1096
1097 &lt;span class=&quot;c1&quot;&gt;# The chains go in order from leaf -&am…
1098 &lt;span class=&quot;c1&quot;&gt;# verified_chain[0] is the same as sock…
1099 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1100 &lt;span class=&quot;n&quot;&gt;verified_chain&lt;/span&gt;&lt;s…
1101
1102 &lt;span class=&quot;c1&quot;&gt;# The individual certificates in the ch…
1103 &lt;span class=&quot;c1&quot;&gt;# .get_info() and .public_bytes(encodin…
1104 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1105 &lt;span class=&quot;s1&quot;&gt;&amp;#39;-----BEGIN CERTIFICATE-----&lt…
1106
1107 &lt;span class=&quot;c1&quot;&gt;# Using _ssl.ENCODING_DER is the same a…
1108 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1109 &lt;span class=&quot;sa&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;s1&q…
1110
1111 &lt;span class=&quot;c1&quot;&gt;# _ssl.Certificate.get_info() is the sa…
1112 &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &l…
1113 &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
1114 &lt;span class=&quot;s2&quot;&gt;&amp;quot;OCSP&amp;quot;&lt;/span&gt;…
1115 &lt;span class=&quot;s2&quot;&gt;&amp;quot;caIssuers&amp;quot;&lt;/spa…
1116 &lt;span class=&quot;s2&quot;&gt;&amp;quot;crlDistributionPoints&amp;q…
1117 &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://crl3.digicert.com/…
1118 &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://crl4.digicert.com/…
1119 &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
1120 &lt;span class=&quot;s2&quot;&gt;&amp;quot;issuer&amp;quot;&lt;/span&g…
1121 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;…
1122 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;…
1123 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;…
1124 &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
1125 &lt;span class=&quot;s2&quot;&gt;&amp;quot;notAfter&amp;quot;&lt;/span…
1126 &lt;span class=&quot;s2&quot;&gt;&amp;quot;notBefore&amp;quot;&lt;/spa…
1127 &lt;span class=&quot;s2&quot;&gt;&amp;quot;serialNumber&amp;quot;&lt;/…
1128 &lt;span class=&quot;s2&quot;&gt;&amp;quot;subject&amp;quot;&lt;/span&…
1129 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;…
1130 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;…
1131 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;…
1132 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;…
1133 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;…
1134 &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
1135 &lt;span class=&quot;s2&quot;&gt;&amp;quot;subjectAltName&amp;quot;&lt…
1136 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s…
1137 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s…
1138 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s…
1139 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s…
1140 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s…
1141 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s…
1142 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s…
1143 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s…
1144 &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
1145 &lt;span class=&quot;s2&quot;&gt;&amp;quot;version&amp;quot;&lt;/span&…
1146 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
1147 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
1148
1149 &lt;h3&gt;What is new with these APIs?&lt;/h3&gt;
1150
1151 &lt;p&gt;Before Python 3.10 the only certificate information we could ga…
1152
1153 &lt;p&gt;With these new APIs applications and libraries can make trust d…
1154
1155 &lt;p&gt;To use a separate API for verifying cert chains we can configur…
1156
1157 &lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span…
1158
1159 &lt;span class=&quot;c1&quot;&gt;# Disable cert verification (enabled by…
1160 &lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt; &lt;span class=&quot;o&…
1161 &lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;o&q…
1162 &lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;o&q…
1163
1164 &lt;span class=&quot;c1&quot;&gt;# Handshake as normal, still set `serve…
1165 &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt; &lt;span class=&quot;o…
1166 &lt;span class=&quot;n&quot;&gt;cert_chain&lt;/span&gt; &lt;span class=&…
1167
1168 &lt;span class=&quot;c1&quot;&gt;# Use a different API to verify certifi…
1169 &lt;span class=&quot;n&quot;&gt;verify_cert_chain_api&lt;/span&gt;&lt;sp…
1170 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
1171
1172 &lt;h3&gt;Difference between &lt;code&gt;verified_chain()&lt;/code&gt; a…
1173
1174 &lt;p&gt;Despite similar names and return types, the &lt;code&gt;verifie…
1175
1176 &lt;p&gt;The difference between a verified and unverified chain is wheth…
1177
1178 &lt;p&gt;For example if the server provides 4 certificates during the TL…
1179
1180 &lt;pre&gt;&lt;code&gt; β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€οΏ½…
1181 β”‚ β”‚ β”‚ β”‚
1182 β”‚ β”‚ β”‚ β”‚
1183 β”‚ A β”œβ”€β”€β”€β–Ί L+ β”‚
1184 β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚
1185 β”‚ β”œβ”€β”€β”€β–Ί β”‚ β”‚ β”‚
1186 β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜
1187 β”‚ C* β”‚
1188 β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”
1189 β”‚ β”œβ”€β”€β”€β–Ί β”‚ Legend
1190 β””β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ ────────�…
1191 β”‚ B β”‚ ─► Signs
1192 β”‚ β”‚ + Entity/leaf
1193 β”‚ β”‚ * Trusted
1194 β””β”€β”€β”€β”€β”€β”€β”€β”˜
1195 &lt;/code&gt;&lt;/pre&gt;
1196
1197 &lt;p&gt;This means that B is not necessary to create a chain of trust f…
1198
1199 &lt;h3&gt;Why are OS trust stores better?&lt;/h3&gt;
1200
1201 &lt;p&gt;Why are OS trust stores superior to OpenSSL on platforms where …
1202
1203 &lt;p&gt;Windows automatically downloads missing intermediate certificat…
1204
1205 &lt;p&gt;Windows and macOS both check certificate revocation lists (CRL)…
1206
1207 &lt;p&gt;For full details on these APIs you can read the documentation o…
1208
1209 &lt;h2&gt;What’s next for trust stores in Python?&lt;/h2&gt;
1210
1211 &lt;p&gt;Python's &lt;code&gt;ssl&lt;/code&gt; module is married to the …
1212
1213 &lt;p&gt;Non-Python native applications are unlikely to use this method,…
1214
1215 &lt;h3&gt;Prior art in PEP 543&lt;/h3&gt;
1216
1217 &lt;p&gt;&lt;a href=&quot;https://www.python.org/dev/peps/pep-0543&quot;…
1218
1219 &lt;p&gt;The &lt;a href=&quot;https://www.python.org/dev/peps/pep-0543/#…
1220
1221 &lt;h3&gt;The end of certifi&lt;/h3&gt;
1222
1223 &lt;p&gt;&lt;a href=&quot;https://github.com/certifi/python-certifi&quot…
1224
1225 &lt;p&gt;This seems like a fine solution at first, but from the perspect…
1226
1227 &lt;p&gt;A small experimental package written by Python core developer &…
1228
1229 &lt;h3&gt;The future is OS trust stores&lt;/h3&gt;
1230
1231 &lt;p&gt;The APIs mentioned above will likely stabilize and be available…
1232
1233 &lt;/div&gt;
1234 &lt;/div&gt;
1235 &lt;div class=&quot;row&quot;&gt;
1236 &lt;div class=&quot;col-12&quot;&gt;
1237 &lt;center&gt;
1238 &lt;div class=&quot;how-to-subscribe&quot;&gt;
1239 Enjoy this post? &lt;span class=&quot;heart&quot;&gt;❀&amp…
1240 &lt;/div&gt;
1241 &lt;/center&gt;
1242 &lt;/div&gt;
1243 &lt;/div&gt;
1244
1245 &lt;div class=&quot;row&quot;&gt;
1246 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
1247 &lt;div class=&quot;col-8&quot;&gt;&lt;center&gt;&lt;small&g…
1248 &lt;div class=&quot;col-2&quot;&gt;&lt;/div&gt;
1249 &lt;/div&gt;
1250 &lt;/div&gt;
1251
1252 &lt;!-- Google Analytics --&gt;
1253 &lt;script async src=&quot;https://www.googletagmanager.com/gtag/js?id=G…
1254 &lt;script&gt;
1255 window.dataLayer = window.dataLayer || [];
1256 function gtag(){dataLayer.push(arguments);}
1257 gtag('js', new Date());
1258 gtag('config', 'G-C3VD7T243W');
1259 &lt;/script&gt;
1260 &lt;/body&gt;
1261 &lt;/html&gt;</content>
1262 </entry>
1263 </feed>
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.