CINXE.COM
Python Weekly - Issue 669
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <!doctype html> <html xmlns:fb="http://www.facebook.com/2008/fbml" xmlns:og="http://opengraph.org/schema/"> <head> <meta property="og:title" content="Python Weekly - Issue 669"> <meta property="fb:page_id" content="43929265776"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="referrer" content="origin"> <!-- NAME: MINIMAL --> <!--[if gte mso 15]> <xml> <o:OfficeDocumentSettings> <o:AllowPNG/> <o:PixelsPerInch>96</o:PixelsPerInch> </o:OfficeDocumentSettings> </xml> <![endif]--> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Python Weekly - Issue 669</title> <style type="text/css"> p{ margin:10px 0; padding:0; } table{ border-collapse:collapse; } h1,h2,h3,h4,h5,h6{ display:block; margin:0; padding:0; } img,a img{ border:0; height:auto; outline:none; text-decoration:none; } body,#bodyTable,#bodyCell{ height:100%; margin:0; padding:0; width:100%; } .mcnPreviewText{ display:none !important; } #outlook a{ padding:0; } img{ -ms-interpolation-mode:bicubic; } table{ mso-table-lspace:0pt; mso-table-rspace:0pt; } .ReadMsgBody{ width:100%; } .ExternalClass{ width:100%; } p,a,li,td,blockquote{ mso-line-height-rule:exactly; } a[href^=tel],a[href^=sms]{ color:inherit; cursor:default; text-decoration:none; } p,a,li,td,body,table,blockquote{ -ms-text-size-adjust:100%; -webkit-text-size-adjust:100%; } .ExternalClass,.ExternalClass p,.ExternalClass td,.ExternalClass div,.ExternalClass span,.ExternalClass font{ line-height:100%; } a[x-apple-data-detectors]{ color:inherit !important; text-decoration:none !important; font-size:inherit !important; font-family:inherit !important; font-weight:inherit !important; line-height:inherit !important; } table[align=left]{ float:left; } table[align=right]{ float:right; } a.mcnButton{ display:block; } .mcnImage,.mcnRetinaImage{ vertical-align:bottom; } .mcnTextContent{ word-break:break-word; } .mcnTextContent img{ height:auto !important; } .mcnDividerBlock{ table-layout:fixed !important; } body,#bodyTable{ background-color:#FEFEFE; } #bodyCell{ border-top:0; } h1{ color:#C52E26 !important; font-family:Helvetica; font-size:28px; font-style:normal; font-weight:bold; line-height:125%; letter-spacing:normal; text-align:left; } h2{ color:#808080 !important; font-family:Helvetica; font-size:26px; font-style:normal; font-weight:bold; line-height:125%; letter-spacing:normal; text-align:left; } h3{ color:#A5A5A5 !important; font-family:Helvetica; font-size:18px; font-style:normal; font-weight:bold; line-height:125%; letter-spacing:normal; text-align:left; } h4{ color:#606060 !important; font-family:Helvetica; font-size:16px; font-style:normal; font-weight:bold; line-height:125%; letter-spacing:normal; text-align:left; } #templatePreheader{ background-color:#EAEAEA; border-top:0; border-bottom:1px solid #D0D0D0; } .preheaderContainer .mcnTextContent,.preheaderContainer .mcnTextContent p{ color:#808080; font-family:Helvetica; font-size:10px; line-height:125%; text-align:left; } .preheaderContainer .mcnTextContent a{ color:#C52E26; font-weight:bold; text-decoration:none; } #templateHeader{ background-color:#FEFEFE; border-top:0; border-bottom:0; } .headerContainer .mcnTextContent,.headerContainer .mcnTextContent p{ color:#606060; font-family:Helvetica; font-size:14px; line-height:150%; text-align:left; } .headerContainer .mcnTextContent a{ color:#C52E26; font-weight:bold; text-decoration:none; } #templateBody{ background-color:#FEFEFE; border-top:0; border-bottom:0; } .bodyContainer .mcnTextContent,.bodyContainer .mcnTextContent p{ color:#606060; font-family:Helvetica; font-size:14px; line-height:150%; text-align:left; } .bodyContainer .mcnTextContent a{ color:#1173c7; font-weight:bold; text-decoration:none; } #templateFooter{ background-color:#FEFEFE; border-top:0; border-bottom:0; } .footerContainer .mcnTextContent,.footerContainer .mcnTextContent p{ color:#808080; font-family:Helvetica; font-size:10px; line-height:125%; text-align:left; } .footerContainer .mcnTextContent a{ color:#C52E26; font-weight:bold; text-decoration:none; } @media only screen and (max-width: 480px){ body,table,td,p,a,li,blockquote{ -webkit-text-size-adjust:none !important; } } @media only screen and (max-width: 480px){ body{ width:100% !important; min-width:100% !important; } } @media only screen and (max-width: 480px){ .templateContainer{ max-width:600px !important; width:100% !important; } } @media only screen and (max-width: 480px){ .mcnRetinaImage{ max-width:100% !important; } } @media only screen and (max-width: 480px){ .mcnImage{ height:auto !important; width:100% !important; } } @media only screen and (max-width: 480px){ .mcnCartContainer,.mcnCaptionTopContent,.mcnRecContentContainer,.mcnCaptionBottomContent,.mcnTextContentContainer,.mcnBoxedTextContentContainer,.mcnImageGroupContentContainer,.mcnCaptionLeftTextContentContainer,.mcnCaptionRightTextContentContainer,.mcnCaptionLeftImageContentContainer,.mcnCaptionRightImageContentContainer,.mcnImageCardLeftTextContentContainer,.mcnImageCardRightTextContentContainer,.mcnImageCardLeftImageContentContainer,.mcnImageCardRightImageContentContainer{ max-width:100% !important; width:100% !important; } } @media only screen and (max-width: 480px){ .mcnBoxedTextContentContainer{ min-width:100% !important; } } @media only screen and (max-width: 480px){ .mcnImageGroupContent{ padding:9px !important; } } @media only screen and (max-width: 480px){ .mcnCaptionLeftContentOuter .mcnTextContent,.mcnCaptionRightContentOuter .mcnTextContent{ padding-top:9px !important; } } @media only screen and (max-width: 480px){ .mcnImageCardTopImageContent,.mcnCaptionBottomContent:last-child .mcnCaptionBottomImageContent,.mcnCaptionBlockInner .mcnCaptionTopContent:last-child .mcnTextContent{ padding-top:18px !important; } } @media only screen and (max-width: 480px){ .mcnImageCardBottomImageContent{ padding-bottom:9px !important; } } @media only screen and (max-width: 480px){ .mcnImageGroupBlockInner{ padding-top:0 !important; padding-bottom:0 !important; } } @media only screen and (max-width: 480px){ .mcnImageGroupBlockOuter{ padding-top:9px !important; padding-bottom:9px !important; } } @media only screen and (max-width: 480px){ .mcnTextContent,.mcnBoxedTextContentColumn{ padding-right:18px !important; padding-left:18px !important; } } @media only screen and (max-width: 480px){ .mcnImageCardLeftImageContent,.mcnImageCardRightImageContent{ padding-right:18px !important; padding-bottom:0 !important; padding-left:18px !important; } } @media only screen and (max-width: 480px){ .mcpreview-image-uploader{ display:none !important; width:100% !important; } } @media only screen and (max-width: 480px){ h1{ font-size:24px !important; line-height:125% !important; } } @media only screen and (max-width: 480px){ h2{ font-size:20px !important; line-height:125% !important; } } @media only screen and (max-width: 480px){ h3{ font-size:18px !important; line-height:125% !important; } } @media only screen and (max-width: 480px){ h4{ font-size:16px !important; line-height:125% !important; } } @media only screen and (max-width: 480px){ .mcnBoxedTextContentContainer .mcnTextContent,.mcnBoxedTextContentContainer .mcnTextContent p{ font-size:18px !important; line-height:125% !important; } } @media only screen and (max-width: 480px){ #templatePreheader{ display:block !important; } } @media only screen and (max-width: 480px){ .preheaderContainer .mcnTextContent,.preheaderContainer .mcnTextContent p{ font-size:14px !important; line-height:115% !important; } } @media only screen and (max-width: 480px){ .headerContainer .mcnTextContent,.headerContainer .mcnTextContent p{ font-size:18px !important; line-height:125% !important; } } @media only screen and (max-width: 480px){ .bodyContainer .mcnTextContent,.bodyContainer .mcnTextContent p{ font-size:18px !important; line-height:125% !important; } } @media only screen and (max-width: 480px){ .footerContainer .mcnTextContent,.footerContainer .mcnTextContent p{ font-size:14px !important; line-height:115% !important; } }</style> <link rel="stylesheet" href="https://us2.campaign-archive.com/css/archivebar-desktop.css" mc:nocompile> </head> <body id="archivebody"> <div id="awesomewrap"> <div id="awesomeshare"> <div id="zclipwrap"> <div class="copy-container"> <label for="clipboardSource">Campaign URL</label> <span id="copyURL"> <input id="clipboardSource" name="shorturl" style="margin-top:6px;" type="text" value="https://mailchi.mp/pythonweekly/python-weekly-issue-669" class="av-text"> <a id="copyToClipboard" href="javascript:;">Copy</a> </span> </div> </div> <ul id="awesomesocial"> <li class="twt"> <div> <a title="Share on Twitter" target="_blank" href="https://twitter.com/share?url=https%3A%2F%2Fmailchi.mp%2Fpythonweekly%2Fpython-weekly-issue-669" rel="noopener noreferrer">Twitter <b>0 <i>tweets</i></b></a> </div> </li> </ul> </div> <ul id="awesomebar"> <li> <a href="http://eepurl.com/fPpcb" title="Subscribe to List" target="_blank" rel="noopener noreferrer">Subscribe</a> </li> <li><a href="https://us2.campaign-archive.com/home/?u=e2e180baf855ac797ef407fc7&id=9e26887fc5" title="View Past Issues" target="_blank" rel="noopener noreferrer">Past Issues</a></li> <li class="float-r"><a class="rss" target="_blank" href="https://us2.campaign-archive.com/feed?u=e2e180baf855ac797ef407fc7&id=9e26887fc5" title="subscribe to the email archive feed" rel="noopener noreferrer">RSS</a></li> <li class="float-r more"><a href="javascript:;" data-to-toggle="#translate">Translate</a> <ul id="translate"> <li> <a rel="nofollow" title="English" href="http://translate.google.com/translate?hl=auto&langpair=auto|en&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">English</a> </li><li> <a rel="nofollow" title="العربية" href="http://translate.google.com/translate?hl=auto&langpair=auto|ar&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">العربية</a> </li><li> <a rel="nofollow" title="Afrikaans" href="http://translate.google.com/translate?hl=auto&langpair=auto|af&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Afrikaans</a> </li><li> <a rel="nofollow" title="беларуская мова" href="http://translate.google.com/translate?hl=auto&langpair=auto|be&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">беларуская мова</a> </li><li> <a rel="nofollow" title="български" href="http://translate.google.com/translate?hl=auto&langpair=auto|bg&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">български</a> </li><li> <a rel="nofollow" title="català" href="http://translate.google.com/translate?hl=auto&langpair=auto|ca&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">català</a> </li><li> <a rel="nofollow" title="中文(简体)" href="http://translate.google.com/translate?hl=auto&langpair=auto|zh-CN&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">中文(简体)</a> </li><li> <a rel="nofollow" title="中文(繁體)" href="http://translate.google.com/translate?hl=auto&langpair=auto|zh-TW&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">中文(繁體)</a> </li><li> <a rel="nofollow" title="Hrvatski" href="http://translate.google.com/translate?hl=auto&langpair=auto|hr&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Hrvatski</a> </li><li> <a rel="nofollow" title="Česky" href="http://translate.google.com/translate?hl=auto&langpair=auto|cs&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Česky</a> </li><li> <a rel="nofollow" title="Dansk" href="http://translate.google.com/translate?hl=auto&langpair=auto|da&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Dansk</a> </li><li> <a rel="nofollow" title="eesti&nbsp;keel" href="http://translate.google.com/translate?hl=auto&langpair=auto|et&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">eesti keel</a> </li><li> <a rel="nofollow" title="Nederlands" href="http://translate.google.com/translate?hl=auto&langpair=auto|nl&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Nederlands</a> </li><li> <a rel="nofollow" title="Suomi" href="http://translate.google.com/translate?hl=auto&langpair=auto|fi&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Suomi</a> </li><li> <a rel="nofollow" title="Fran&ccedil;ais" href="http://translate.google.com/translate?hl=auto&langpair=auto|fr&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Français</a> </li><li> <a rel="nofollow" title="Deutsch" href="http://translate.google.com/translate?hl=auto&langpair=auto|de&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Deutsch</a> </li><li> <a rel="nofollow" title="&Epsilon;&lambda;&lambda;&eta;&nu;&iota;&kappa;ή" href="http://translate.google.com/translate?hl=auto&langpair=auto|el&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Ελληνική</a> </li><li> <a rel="nofollow" title="हिन्दी" href="http://translate.google.com/translate?hl=auto&langpair=auto|hi&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">हिन्दी</a> </li><li> <a rel="nofollow" title="Magyar" href="http://translate.google.com/translate?hl=auto&langpair=auto|hu&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Magyar</a> </li><li> <a rel="nofollow" title="Gaeilge" href="http://translate.google.com/translate?hl=auto&langpair=auto|ga&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Gaeilge</a> </li><li> <a rel="nofollow" title="Indonesia" href="http://translate.google.com/translate?hl=auto&langpair=auto|id&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Indonesia</a> </li><li> <a rel="nofollow" title="íslenska" href="http://translate.google.com/translate?hl=auto&langpair=auto|is&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">íslenska</a> </li><li> <a rel="nofollow" title="Italiano" href="http://translate.google.com/translate?hl=auto&langpair=auto|it&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Italiano</a> </li><li> <a rel="nofollow" title="日本語" href="http://translate.google.com/translate?hl=auto&langpair=auto|ja&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">日本語</a> </li><li> <a rel="nofollow" title="ភាសាខ្មែរ" href="http://translate.google.com/translate?hl=auto&langpair=auto|km&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">ភាសាខ្មែរ</a> </li><li> <a rel="nofollow" title="한국어" href="http://translate.google.com/translate?hl=auto&langpair=auto|ko&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">한국어</a> </li><li> <a rel="nofollow" title="македонски&nbsp;јазик" href="http://translate.google.com/translate?hl=auto&langpair=auto|mk&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">македонски јазик</a> </li><li> <a rel="nofollow" title="بهاس ملايو" href="http://translate.google.com/translate?hl=auto&langpair=auto|ms&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">بهاس ملايو</a> </li><li> <a rel="nofollow" title="Malti" href="http://translate.google.com/translate?hl=auto&langpair=auto|mt&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Malti</a> </li><li> <a rel="nofollow" title="Norsk" href="http://translate.google.com/translate?hl=auto&langpair=auto|no&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Norsk</a> </li><li> <a rel="nofollow" title="Polski" href="http://translate.google.com/translate?hl=auto&langpair=auto|pl&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Polski</a> </li><li> <a rel="nofollow" title="Portugu&ecirc;s" href="http://translate.google.com/translate?hl=auto&langpair=auto|pt&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Português</a> </li><li> <a rel="nofollow" title="Portugu&ecirc;s&nbsp;-&nbsp;Portugal" href="http://translate.google.com/translate?hl=auto&langpair=auto|pt-PT&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Português - Portugal</a> </li><li> <a rel="nofollow" title="Rom&acirc;nă" href="http://translate.google.com/translate?hl=auto&langpair=auto|ro&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Română</a> </li><li> <a rel="nofollow" title="Русский" href="http://translate.google.com/translate?hl=auto&langpair=auto|ru&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Русский</a> </li><li> <a rel="nofollow" title="Espa&ntilde;ol" href="http://translate.google.com/translate?hl=auto&langpair=auto|es&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Español</a> </li><li> <a rel="nofollow" title="Kiswahili" href="http://translate.google.com/translate?hl=auto&langpair=auto|sw&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Kiswahili</a> </li><li> <a rel="nofollow" title="Svenska" href="http://translate.google.com/translate?hl=auto&langpair=auto|sv&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Svenska</a> </li><li> <a rel="nofollow" title="עברית" href="http://translate.google.com/translate?hl=auto&langpair=auto|iw&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">עברית</a> </li><li> <a rel="nofollow" title="Lietuvių" href="http://translate.google.com/translate?hl=auto&langpair=auto|lt&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Lietuvių</a> </li><li> <a rel="nofollow" title="latviešu" href="http://translate.google.com/translate?hl=auto&langpair=auto|lv&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">latviešu</a> </li><li> <a rel="nofollow" title="slovenčina" href="http://translate.google.com/translate?hl=auto&langpair=auto|sk&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">slovenčina</a> </li><li> <a rel="nofollow" title="slovenščina" href="http://translate.google.com/translate?hl=auto&langpair=auto|sl&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">slovenščina</a> </li><li> <a rel="nofollow" title="српски" href="http://translate.google.com/translate?hl=auto&langpair=auto|sr&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">српски</a> </li><li> <a rel="nofollow" title="தமிழ்" href="http://translate.google.com/translate?hl=auto&langpair=auto|ta&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">தமிழ்</a> </li><li> <a rel="nofollow" title="ภาษาไทย" href="http://translate.google.com/translate?hl=auto&langpair=auto|th&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">ภาษาไทย</a> </li><li> <a rel="nofollow" title="Türkçe" href="http://translate.google.com/translate?hl=auto&langpair=auto|tr&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Türkçe</a> </li><li> <a rel="nofollow" title="Filipino" href="http://translate.google.com/translate?hl=auto&langpair=auto|tl&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Filipino</a> </li><li> <a rel="nofollow" title="украї́нська" href="http://translate.google.com/translate?hl=auto&langpair=auto|uk&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">украї́нська</a> </li><li> <a rel="nofollow" title="Tiếng&nbsp;Việt" href="http://translate.google.com/translate?hl=auto&langpair=auto|vi&u=https%3A%2F%2Fus2.campaign-archive.com%2F%3Fu%3De2e180baf855ac797ef407fc7%26id%3D973d5526f0">Tiếng Việt</a> </li> </ul> </li> </ul> </div> <body leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0" style="height: 100%;margin: 0;padding: 0;width: 100%;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #FEFEFE;"> <!----> <center> <table align="center" border="0" cellpadding="0" cellspacing="0" height="100%" width="100%" id="bodyTable" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;height: 100%;margin: 0;padding: 0;width: 100%;background-color: #FEFEFE;"> <tr> <td align="center" valign="top" id="bodyCell" style="padding-bottom: 40px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;height: 100%;margin: 0;padding: 0;width: 100%;border-top: 0;"> <!-- BEGIN TEMPLATE // --> <table border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tr> <td align="center" valign="top" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!-- BEGIN PREHEADER // --> <table border="0" cellpadding="0" cellspacing="0" width="100%" id="templatePreheader" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #EAEAEA;border-top: 0;border-bottom: 1px solid #D0D0D0;"> <tr> <td align="center" valign="top" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <table border="0" cellpadding="0" cellspacing="0" width="600" class="templateContainer" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tr> <td valign="top" class="preheaderContainer" style="padding-top: 9px;padding-bottom: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody class="mcnTextBlockOuter"> <tr> <td valign="top" class="mcnTextBlockInner" style="padding-top: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!--[if mso]> <table align="left" border="0" cellspacing="0" cellpadding="0" width="100%" style="width:100%;"> <tr> <![endif]--> <!--[if mso]> <td valign="top" width="600" style="width:600px;"> <![endif]--> <table align="left" border="0" cellpadding="0" cellspacing="0" style="max-width: 100%;min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;float: left;" width="100%" class="mcnTextContentContainer"> <tbody><tr> <td valign="top" class="mcnTextContent" style="padding: 0px 18px 9px;text-align: center;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #808080;font-family: Helvetica;font-size: 10px;line-height: 125%;"> <a href="https://mailchi.mp/pythonweekly/python-weekly-issue-669?e=[UNIQID]" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #C52E26;font-weight: bold;text-decoration: none;">View this email in your browser</a> </td> </tr> </tbody></table> <!--[if mso]> </td> <![endif]--> <!--[if mso]> </tr> </table> <![endif]--> </td> </tr> </tbody> </table></td> </tr> </table> </td> </tr> </table> <!-- // END PREHEADER --> </td> </tr> <tr> <td align="center" valign="top" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!-- BEGIN HEADER // --> <table border="0" cellpadding="0" cellspacing="0" width="100%" id="templateHeader" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #FEFEFE;border-top: 0;border-bottom: 0;"> <tr> <td align="center" valign="top" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <table border="0" cellpadding="0" cellspacing="0" width="600" class="templateContainer" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tr> <td valign="top" class="headerContainer" style="padding-top: 9px;padding-bottom: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" "=""><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnDividerBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;table-layout: fixed !important;"> <tbody class="mcnDividerBlockOuter"> <tr> <td class="mcnDividerBlockInner" style="min-width: 100%;padding: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <table class="mcnDividerContent" border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody><tr> <td style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <span></span> </td> </tr> </tbody></table> <!-- <td class="mcnDividerBlockInner" style="padding: 18px;"> <hr class="mcnDividerContent" style="border-bottom-color:none; border-left-color:none; border-right-color:none; border-bottom-width:0; border-left-width:0; border-right-width:0; margin-top:0; margin-right:0; margin-bottom:0; margin-left:0;" /> --> </td> </tr> </tbody> </table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody class="mcnTextBlockOuter"> <tr> <td valign="top" class="mcnTextBlockInner" style="padding-top: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!--[if mso]> <table align="left" border="0" cellspacing="0" cellpadding="0" width="100%" style="width:100%;"> <tr> <![endif]--> <!--[if mso]> <td valign="top" width="600" style="width:600px;"> <![endif]--> <table align="left" border="0" cellpadding="0" cellspacing="0" style="max-width: 100%;min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;float: left;" width="100%" class="mcnTextContentContainer"> <tbody><tr> <td valign="top" class="mcnTextContent" style="padding: 0px 18px 9px;color: #222222;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;"> <h1 style="text-align: center;display: block;margin: 0;padding: 0;font-family: Helvetica;font-size: 28px;font-style: normal;font-weight: bold;line-height: 125%;letter-spacing: normal;color: #C52E26 !important;"><span style="font-size:30px"><span style="color:#2F4F4F">Python Weekly</span></span></h1> </td> </tr> </tbody></table> <!--[if mso]> </td> <![endif]--> <!--[if mso]> </tr> </table> <![endif]--> </td> </tr> </tbody> </table></td> </tr> </table> </td> </tr> </table> <!-- // END HEADER --> </td> </tr> <tr> <td align="center" valign="top" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!-- BEGIN BODY // --> <table border="0" cellpadding="0" cellspacing="0" width="100%" id="templateBody" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #FEFEFE;border-top: 0;border-bottom: 0;"> <tr> <td align="center" valign="top" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <table border="0" cellpadding="0" cellspacing="0" width="600" class="templateContainer" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tr> <td valign="top" class="bodyContainer" style="padding-top: 9px;padding-bottom: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody class="mcnTextBlockOuter"> <tr> <td valign="top" class="mcnTextBlockInner" style="padding-top: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!--[if mso]> <table align="left" border="0" cellspacing="0" cellpadding="0" width="100%" style="width:100%;"> <tr> <![endif]--> <!--[if mso]> <td valign="top" width="600" style="width:600px;"> <![endif]--> <table align="left" border="0" cellpadding="0" cellspacing="0" style="max-width: 100%;min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;float: left;" width="100%" class="mcnTextContentContainer"> <tbody><tr> <td valign="top" class="mcnTextContent" style="padding-top: 0;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;"> Welcome to issue 669 of Python Weekly. Let's get straight to the links this week. </td> </tr> </tbody></table> <!--[if mso]> </td> <![endif]--> <!--[if mso]> </tr> </table> <![endif]--> </td> </tr> </tbody> </table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody class="mcnTextBlockOuter"> <tr> <td valign="top" class="mcnTextBlockInner" style="padding-top: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!--[if mso]> <table align="left" border="0" cellspacing="0" cellpadding="0" width="100%" style="width:100%;"> <tr> <![endif]--> <!--[if mso]> <td valign="top" width="600" style="width:600px;"> <![endif]--> <table align="left" border="0" cellpadding="0" cellspacing="0" style="max-width: 100%;min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;float: left;" width="100%" class="mcnTextContentContainer"> <tbody><tr> <td valign="top" class="mcnTextContent" style="padding-top: 0;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;"> <strong><span style="color:#B22222"><span style="font-size:16px">From Our Sponsor</span></span> </strong><br> <table cellspacing="5" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody> <tr> <td style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><a href="https://theanchorgroup.swoogo.com/devseccon/5954645?ref=python-weekly&utm_medium=em-pa&utm_source=python-weekly&utm_content=events_241008_devseccon&utm_campaign=dm_pp-python-weekly-240926_241008_devseccon" style="color: #1173C7;text-decoration: underline;font-weight: bold;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><img border="none" src="https://mcusercontent.com/e2e180baf855ac797ef407fc7/images/a0276a1b-762d-aad2-c1c4-2fc5b1bd3212.png" style="border: 0;height: auto !important;outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;"></a></td> <td style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> </td> <td valign="middle" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><span style="font-size:13px">Join Snyk at </span><span style="font-size:14px"><a href="https://theanchorgroup.swoogo.com/devseccon/5954645?ref=python-weekly&utm_medium=em-pa&utm_source=python-weekly&utm_content=events_241008_devseccon&utm_campaign=dm_pp-python-weekly-240926_241008_devseccon" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">DevSecCon 2024: Developing AI Trust</a></span><span style="font-size:13px">, hosted by Snyk on October 8-9. For all our developers, hear from <strong>Leonardo Zanivan, from Okta</strong>, who will be discussing how to <strong>Secure Node.js Applications from Supply Chain Attacks.</strong> <a href="https://theanchorgroup.swoogo.com/devseccon/5954645?ref=python-weekly&utm_medium=em-pa&utm_source=python-weekly&utm_content=events_241008_devseccon&utm_campaign=dm_pp-python-weekly-240926_241008_devseccon" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Save your spot today! </a></span></td> </tr> </tbody> </table> <br> <br> <span style="color:#B22222"><strong><span style="font-size:16px">Articles, Tutorials and Talks</span></strong></span><br> <br> <span style="font-size:14px"><a href="https://www.youtube.com/watch?v=t5rYZqiKOL0" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Python.jl—Seamlessly blend Python and Julia</a></span> <img align="center" data-file-id="464" height="16" src="https://mcusercontent.com/e2e180baf855ac797ef407fc7/images/af76283a-6e65-436c-967a-900427cf6399.png" style="border: 0px;width: 16px;height: 16px;margin: 0px;outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;" width="16"><br> The talk introduces Python.jl, a Julia package that seamlessly blends Python and Julia syntax, allowing users to write code that mixes elements from both languages in a single environment. While presented as a lighthearted experiment, the project demonstrates Julia's flexibility in creating domain-specific languages and highlights the challenges of integrating two different programming languages.<br> <br> <span style="font-size:14px"><a href="https://kristoff.it/blog/python-training-wheels/" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">The Python Package Index Should Get Rid Of Its Training Wheels</a></span><br> This article discusses challenges with storing pre-built binaries for Python packages on PyPI and proposes a solution for creating them on-demand to save space and make PyPI more sustainable.<br> <br> <span style="font-size:14px"><a href="https://www.psycopg.org/articles/2024/09/23/async-to-sync/" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Automatic async to sync code conversion</a></span><br> The article describes how Psycopg 3 implemented an automatic conversion system to generate synchronous Python code from asynchronous code, reducing code duplication and maintenance efforts. The process involves using Abstract Syntax Trees (AST) to transform async code into equivalent sync code, with custom transformations and helper functions to handle complex cases.<br> <br> <span style="font-size:14px"><a href="https://engineering.fb.com/2024/09/17/data-infrastructure/inside-bento-jupyter-notebooks-at-meta/" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Inside Bento: Jupyter Notebooks at Meta</a> <img align="center" data-file-id="468" height="16" src="https://mcusercontent.com/e2e180baf855ac797ef407fc7/images/9a9a57d0-eb4b-47f8-8af4-55ba50e8c350.png" style="border: 0px;width: 16px;height: 16px;margin: 0px;outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;" width="16"></span><br> Meta has developed Bento, an internal platform that enhances Jupyter notebooks with features like version control, collaborative editing, and automated dependency management. This system, which handles over 150,000 notebooks and supports 18,000 monthly active users, aims to improve productivity and collaboration for data scientists and engineers across Meta's various teams and projects.<br> <br> <span style="font-size:14px"><a href="https://blog.jetbrains.com/pycharm/2024/09/how-to-use-fastapi-for-machine-learning/" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">How to Use FastAPI for Machine Learning</a></span><br> Learn how to use FastAPI for machine learning. Explore the framework's benefits and why it's popular, and understand how to integrate it into your ML workflows.<br> <br> <span style="font-size:14px"><a href="https://anyblockers.com/posts/building-rag-with-postgres" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Building RAG with Postgres</a></span><br> A step by step guide to building a RAG system with Postgres.<br> <br> <span style="font-size:14px"><a href="https://www.youtube.com/watch?v=WI6CqykFbDc" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">How to Design an AWESOME Function Signature in Python</a> <img align="center" data-file-id="464" height="16" src="https://mcusercontent.com/e2e180baf855ac797ef407fc7/images/af76283a-6e65-436c-967a-900427cf6399.png" style="border: 0px;width: 16px;height: 16px;margin: 0px;outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;" width="16"></span><br> This video demonstrates how to design a great function header in Python, highlighting aspects that are often overlooked but can significantly impact the quality of the code. Important considerations will be discussed to enhance coding practices and improve overall functionality.<br> <br> <span style="font-size:14px"><a href="https://labs.quansight.org/blog/multi-dimensional-sparse-arrays" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Multi-dimensional Sparse Arrays in SciPy</a></span><br> The article explores multi-dimensional sparse arrays and their implementation in scientific computing, focusing on their efficiency in handling large datasets with mostly empty or zero-valued elements. It emphasizes the benefits of sparse arrays for memory optimization and computational performance in various data-heavy applications.<br> <br> <span style="font-size:14px"><a href="https://myscale.com/blog/what-is-contrastive-learning" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">An In-Depth Guide to Contrastive Learning: Techniques, Models, and Applications</a></span><br> Discover the fundamentals of contrastive learning, including key techniques like SimCLR, MoCo, and CLIP. Learn how contrastive learning improves unsupervised learning and its practical applications.<br> <br> <span style="font-size:14px"><a href="https://www.answer.ai/posts/2024-09-16-rerankers.html" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">rerankers: A Lightweight Python Library to Unify Ranking Methods</a></span><br> Re-ranking is an integral component of many retrieval pipelines; however, there exist numerous approaches to it, all with different implementation methods. To mitigate this, we propose rerankers, a Python library which provides a simple, easy-to-use interface to all commonly used re-ranking approaches.<br> <br> <span style="font-size:14px"><a href="https://www.youtube.com/watch?v=I_IchaIdmnA" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Python Tutorial: Build a Course Platform with Django, HTMX, TailwindCSS and Cloudinary</a> <img align="center" data-file-id="464" height="16" src="https://mcusercontent.com/e2e180baf855ac797ef407fc7/images/af76283a-6e65-436c-967a-900427cf6399.png" style="border: 0px;width: 16px;height: 16px;margin: 0px;outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;" width="16"></span><br> Learn how to build a Course Platform from scratch. Host video-based courses, manage thumbnails, restrict access to confirmed emails only, optimize thumbnails, customize the Django admin and much more.<br> <br> <br> <strong><span style="color:#B22222"><span style="font-size:16px">Interesting Projects, Tools and Libraries</span></span></strong><br> <br> <a href="https://github.com/radiac/nanodjango" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">nanodjango</a><br> Full Django in a single file - views, models, API ,with async support. Automatically convert it to a full project.<br> <br> <span style="font-size:14px"><a href="https://github.com/kyutai-labs/moshi" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Moshi</a></span><br> A speech-text foundation model for real time dialogue.<br> <br> <span style="font-size:14px"><a href="https://github.com/qhjqhj00/MemoRAG" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">MemoRAG</a></span><br> Empowering RAG with a memory-based data interface for all-purpose applications!<br> <br> <span style="font-size:14px"><a href="https://github.com/cle-b/httpdbg" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">httpdbg</a></span><br> A tool for Python developers to easily debug the HTTP(S) client requests in a Python program.<br> <br> <span style="font-size:14px"><a href="https://github.com/itsthejoker/spiderweb" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Spiderweb</a></span><br> A small web framework, just big enough for a spider. Also check an <a href="https://itsthejoker.github.io/spiderweb-the-tiny-web-framework" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">article</a> introducing it.<br> <br> <span style="font-size:14px"><a href="https://github.com/MODSetter/SurfSense" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">SurfSense</a></span><br> Personal AI Assistant for World Wide Web Surfers. Research & Never forget anything you see on the Internet.<br> <br> <span style="font-size:14px"><a href="https://github.com/ebonnal/streamable" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">streamable</a></span><br> Stream-like manipulation of Python iterables: fluent, typed, lazy, concurrent.<br> <br> <span style="font-size:14px"><a href="https://github.com/skrub-data/skrub/" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">skrub</a></span><br> A Python library that facilitates prepping your tables for machine learning.<br> <br> <span style="font-size:14px"><a href="https://github.com/lds133/weather_landscape" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">weather_landscape</a></span><br> Visualizing Weather Forecasts Through Landscape Imagery.<br> <br> <span style="font-size:14px"><a href="https://github.com/TianxingChen/RoboTwin" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">RoboTwin</a></span><br> Dual-Arm Robot Benchmark with Generative Digital Twins.<br> <br> <br> <strong><span style="color:#B22222"><span style="font-size:16px">Upcoming Events and Webinars</span></span></strong><br> <br> <span style="font-size:14px"><a href="https://www.meetup.com/pydata-london-meetup/events/303641583/" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">PyData London Meetup October 2024</a></span><br> There will be following talks <ul> <li style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">Cosmos: Translating dbt to Apache Airflow</li> <li style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">Real-time plane-spotting with Apache Druid and Python</li> <li style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">Seamless array computation using ndonnx</li> <li style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">DSPy - A new way of prompting with LLM</li> </ul> <br> <span style="font-size:14px"><a href="https://www.meetup.com/michigan-python/events/300498467" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Hybrid: Michigan Python Meetup October 2024</a></span><br> There will be a talk, Automating eBay with Python.<br> <br> <span style="font-size:14px"><a href="https://www.meetup.com/pydata-lausanne/events/303407729" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">PyData Lausanne Meetup October 2024</a></span><br> There will be following talks <ul> <li style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">Machine Learning and Computational Chemistry: Tackling the Complexities of Chemical Reactivity in Condensed Phases</li> <li style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">A friendly guide to Python packaging</li> </ul> <br> <span style="font-size:14px"><a href="https://www.meetup.com/pydatariyadh/events/303621443/" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">PyData Riyadh Meetup September 2024</a></span><br> There will be a talk, Writing (Machine) Friendly Code.<br> </td> </tr> </tbody></table> <!--[if mso]> </td> <![endif]--> <!--[if mso]> </tr> </table> <![endif]--> </td> </tr> </tbody> </table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnBoxedTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!--[if gte mso 9]> <table align="center" border="0" cellspacing="0" cellpadding="0" width="100%"> <![endif]--> <tbody class="mcnBoxedTextBlockOuter"> <tr> <td valign="top" class="mcnBoxedTextBlockInner" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!--[if gte mso 9]> <td align="center" valign="top" "> <![endif]--> <table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;float: left;" class="mcnBoxedTextContentContainer"> <tbody><tr> <td style="padding-top: 9px;padding-left: 18px;padding-bottom: 9px;padding-right: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <table border="0" cellspacing="0" class="mcnTextContentContainer" width="100%" style="min-width: 100% !important;background-color: #FEFEFE;border: 1px solid #D5D5D5;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody><tr> <td valign="top" class="mcnTextContent" style="padding: 18px;color: #C52E26;font-family: Arial;font-size: 16px;font-weight: bold;line-height: 100%;text-align: left;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;"> Our Other Newsletters </td> </tr> </tbody></table> </td> </tr> </tbody></table> <!--[if gte mso 9]> </td> <![endif]--> <!--[if gte mso 9]> </tr> </table> <![endif]--> </td> </tr> </tbody> </table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody class="mcnTextBlockOuter"> <tr> <td valign="top" class="mcnTextBlockInner" style="padding-top: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!--[if mso]> <table align="left" border="0" cellspacing="0" cellpadding="0" width="100%" style="width:100%;"> <tr> <![endif]--> <!--[if mso]> <td valign="top" width="600" style="width:600px;"> <![endif]--> <table align="left" border="0" cellpadding="0" cellspacing="0" style="max-width: 100%;min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;float: left;" width="100%" class="mcnTextContentContainer"> <tbody><tr> <td valign="top" class="mcnTextContent" style="padding-top: 0;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;"> <a href="https://www.programmerweekly.com/?utm_source=pw&utm_medium=newsletter" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Programmer Weekly</a> - A free weekly newsletter for programmers.<br> <br> <a href="http://www.founderweekly.com/?utm_source=pw&utm_medium=newsletter" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #1173c7;font-weight: bold;text-decoration: none;">Founder Weekly</a> - A free weekly newsletter for entrepreneurs featuring best curated content, must read articles, how to guides, tips and tricks, resources, events and more.<br> </td> </tr> </tbody></table> <!--[if mso]> </td> <![endif]--> <!--[if mso]> </tr> </table> <![endif]--> </td> </tr> </tbody> </table></td> </tr> </table> </td> </tr> </table> <!-- // END BODY --> </td> </tr> <tr> <td align="center" valign="top" style="padding-bottom: 40px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!-- BEGIN FOOTER // --> <table border="0" cellpadding="0" cellspacing="0" width="100%" id="templateFooter" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #FEFEFE;border-top: 0;border-bottom: 0;"> <tr> <td align="center" valign="top" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <table border="0" cellpadding="0" cellspacing="0" width="600" class="templateContainer" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tr> <td valign="top" class="footerContainer" style="padding-top: 9px;padding-bottom: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnDividerBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;table-layout: fixed !important;"> <tbody class="mcnDividerBlockOuter"> <tr> <td class="mcnDividerBlockInner" style="min-width: 100%;padding: 9px 18px 27px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <table class="mcnDividerContent" border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width: 100%;border-top: 1px solid #D5D5D5;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody><tr> <td style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <span></span> </td> </tr> </tbody></table> <!-- <td class="mcnDividerBlockInner" style="padding: 18px;"> <hr class="mcnDividerContent" style="border-bottom-color:none; border-left-color:none; border-right-color:none; border-bottom-width:0; border-left-width:0; border-right-width:0; margin-top:0; margin-right:0; margin-bottom:0; margin-left:0;" /> --> </td> </tr> </tbody> </table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <tbody class="mcnTextBlockOuter"> <tr> <td valign="top" class="mcnTextBlockInner" style="padding-top: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"> <!--[if mso]> <table align="left" border="0" cellspacing="0" cellpadding="0" width="100%" style="width:100%;"> <tr> <![endif]--> <!--[if mso]> <td valign="top" width="600" style="width:600px;"> <![endif]--> <table align="left" border="0" cellpadding="0" cellspacing="0" style="max-width: 100%;min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;float: left;" width="100%" class="mcnTextContentContainer"> <tbody><tr> <td valign="top" class="mcnTextContent" style="padding-top: 0;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #808080;font-family: Helvetica;font-size: 10px;line-height: 125%;text-align: left;"> <em>Copyright © 2024 Python Weekly, All rights reserved.</em> <br> <br> <br> Want to change how you receive these emails?<br> You can <a href="https://pythonweekly.us2.list-manage.com/profile?u=e2e180baf855ac797ef407fc7&id=9e26887fc5&e=[UNIQID]&c=973d5526f0" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #C52E26;font-weight: bold;text-decoration: none;">update your preferences</a> or <a href="https://pythonweekly.us2.list-manage.com/unsubscribe?u=e2e180baf855ac797ef407fc7&id=9e26887fc5&t=b&e=[UNIQID]&c=973d5526f0" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #C52E26;font-weight: bold;text-decoration: none;">unsubscribe from this list</a>. <br> <br> </td> </tr> </tbody></table> <!--[if mso]> </td> <![endif]--> <!--[if mso]> </tr> </table> <![endif]--> </td> </tr> </tbody> </table></td> </tr> </table> </td> </tr> </table> <!-- // END FOOTER --> </td> </tr> </table> <!-- // END TEMPLATE --> </td> </tr> </table> </center> </body> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script><script type="text/javascript"> $(document).ready(function() { document.getElementById("copyToClipboard").addEventListener("click", function () { var input = document.getElementById("clipboardSource"); input.select(); var successful = document.execCommand("copy"); if (successful) { alert('Copied "' + input.value + '" to your clipboard.'); } else { throw new Error("Failed to copy text (verify caller was in the context of an event handler)"); } }); $('li.more > a').click(function(){ var toToggle = $($(this).attr('data-to-toggle')); if(toToggle.is(':visible')){ toToggle.slideUp('fast'); $(this).removeClass('is-active'); if ($('#awesomebar').find('.is-active').length < 1){ $('#awesomebar').removeClass('sub-active'); } } else { toToggle.slideDown('fast'); $(this).addClass('is-active'); $('#awesomebar').addClass('sub-active'); } return false; }); }); </script></body> </html>