CINXE.COM
Python Software Foundation News: 05/01/2020 - 06/01/2020
<!DOCTYPE html> <html class='v2' dir='ltr' lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css' rel='stylesheet' type='text/css'/> <!-- Google tag (gtag.js) --> <script async='async' src='https://www.googletagmanager.com/gtag/js?id=G-H6ZX4B41B7'></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-H6ZX4B41B7'); </script> <meta content='Python Software Foundation Blog' property='og:site_name'/> <meta content='https://pyfound.blogspot.com' property='og:url'/> <meta content='' property='og:description'/> <meta content='' property='og:type'/> <meta content='https://s3.dualstack.us-east-2.amazonaws.com/pythondotorg-assets/media/psf/grants/report-2006-10/psf-logo.png' property='og:image'/> <meta content='width=1100' name='viewport'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href='https://pyfound.blogspot.com/favicon.ico' rel='icon' type='image/x-icon'/> <link href='https://pyfound.blogspot.com/2020/05/' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Python Software Foundation News - Atom" href="https://pyfound.blogspot.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Python Software Foundation News - RSS" href="https://pyfound.blogspot.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Python Software Foundation News - Atom" href="https://www.blogger.com/feeds/8520/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='https://pyfound.blogspot.com/2020/05/' property='og:url'/> <meta content='Python Software Foundation News' property='og:title'/> <meta content='聽聽News from the Python Software Foundation' property='og:description'/> <title>Python Software Foundation News: 05/01/2020 - 06/01/2020</title> <style id='page-skin-1' type='text/css'><!-- /* ----------------------------------------------- Blogger Template Style Name: Simple Designer: Blogger URL: www.blogger.com ----------------------------------------------- */ /* Variable definitions ==================== <Variable name="keycolor" description="Main Color" type="color" default="#66bbdd"/> <Group description="Page Text" selector="body"> <Variable name="body.font" description="Font" type="font" default="normal normal 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="body.text.color" description="Text Color" type="color" default="#222222"/> </Group> <Group description="Backgrounds" selector=".body-fauxcolumns-outer"> <Variable name="body.background.color" description="Outer Background" type="color" default="#66bbdd"/> <Variable name="content.background.color" description="Main Background" type="color" default="#ffffff"/> <Variable name="header.background.color" description="Header Background" type="color" default="transparent"/> </Group> <Group description="Links" selector=".main-outer"> <Variable name="link.color" description="Link Color" type="color" default="#2288bb"/> <Variable name="link.visited.color" description="Visited Color" type="color" default="#888888"/> <Variable name="link.hover.color" description="Hover Color" type="color" default="#33aaff"/> </Group> <Group description="Blog Title" selector=".header h1"> <Variable name="header.font" description="Font" type="font" default="normal normal 60px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="header.text.color" description="Title Color" type="color" default="#3399bb" /> </Group> <Group description="Blog Description" selector=".header .description"> <Variable name="description.text.color" description="Description Color" type="color" default="#777777" /> </Group> <Group description="Tabs Text" selector=".tabs-inner .widget li a"> <Variable name="tabs.font" description="Font" type="font" default="normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="tabs.text.color" description="Text Color" type="color" default="#999999"/> <Variable name="tabs.selected.text.color" description="Selected Color" type="color" default="#000000"/> </Group> <Group description="Tabs Background" selector=".tabs-outer .PageList"> <Variable name="tabs.background.color" description="Background Color" type="color" default="#f5f5f5"/> <Variable name="tabs.selected.background.color" description="Selected Color" type="color" default="#eeeeee"/> </Group> <Group description="Post Title" selector="h3.post-title, .comments h4"> <Variable name="post.title.font" description="Font" type="font" default="normal normal 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> </Group> <Group description="Date Header" selector=".date-header"> <Variable name="date.header.color" description="Text Color" type="color" default="#666666"/> <Variable name="date.header.background.color" description="Background Color" type="color" default="transparent"/> <Variable name="date.header.font" description="Text Font" type="font" default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="date.header.padding" description="Date Header Padding" type="string" default="inherit"/> <Variable name="date.header.letterspacing" description="Date Header Letter Spacing" type="string" default="inherit"/> <Variable name="date.header.margin" description="Date Header Margin" type="string" default="inherit"/> </Group> <Group description="Post Footer" selector=".post-footer"> <Variable name="post.footer.text.color" description="Text Color" type="color" default="#666666"/> <Variable name="post.footer.background.color" description="Background Color" type="color" default="#f9f9f9"/> <Variable name="post.footer.border.color" description="Shadow Color" type="color" default="#eeeeee"/> </Group> <Group description="Gadgets" selector="h2"> <Variable name="widget.title.font" description="Title Font" type="font" default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="widget.title.text.color" description="Title Color" type="color" default="#000000"/> <Variable name="widget.alternate.text.color" description="Alternate Color" type="color" default="#999999"/> </Group> <Group description="Images" selector=".main-inner"> <Variable name="image.background.color" description="Background Color" type="color" default="#ffffff"/> <Variable name="image.border.color" description="Border Color" type="color" default="#eeeeee"/> <Variable name="image.text.color" description="Caption Text Color" type="color" default="#666666"/> </Group> <Group description="Accents" selector=".content-inner"> <Variable name="body.rule.color" description="Separator Line Color" type="color" default="#eeeeee"/> <Variable name="tabs.border.color" description="Tabs Border Color" type="color" default="#ffd343"/> </Group> <Variable name="body.background" description="Body Background" type="background" color="#eeeeee" default="$(color) none repeat scroll top left"/> <Variable name="body.background.override" description="Body Background Override" type="string" default=""/> <Variable name="body.background.gradient.cap" description="Body Gradient Cap" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/gradients_light.png)"/> <Variable name="body.background.gradient.tile" description="Body Gradient Tile" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/body_gradient_tile_light.png)"/> <Variable name="content.background.color.selector" description="Content Background Color Selector" type="string" default=".content-inner"/> <Variable name="content.padding" description="Content Padding" type="length" default="10px" min="0" max="100px"/> <Variable name="content.padding.horizontal" description="Content Horizontal Padding" type="length" default="10px" min="0" max="100px"/> <Variable name="content.shadow.spread" description="Content Shadow Spread" type="length" default="40px" min="0" max="100px"/> <Variable name="content.shadow.spread.webkit" description="Content Shadow Spread (WebKit)" type="length" default="5px" min="0" max="100px"/> <Variable name="content.shadow.spread.ie" description="Content Shadow Spread (IE)" type="length" default="10px" min="0" max="100px"/> <Variable name="main.border.width" description="Main Border Width" type="length" default="0" min="0" max="10px"/> <Variable name="header.background.gradient" description="Header Gradient" type="url" default="none"/> <Variable name="header.shadow.offset.left" description="Header Shadow Offset Left" type="length" default="-1px" min="-50px" max="50px"/> <Variable name="header.shadow.offset.top" description="Header Shadow Offset Top" type="length" default="-1px" min="-50px" max="50px"/> <Variable name="header.shadow.spread" description="Header Shadow Spread" type="length" default="1px" min="0" max="100px"/> <Variable name="header.padding" description="Header Padding" type="length" default="30px" min="0" max="100px"/> <Variable name="header.border.size" description="Header Border Size" type="length" default="1px" min="0" max="10px"/> <Variable name="header.bottom.border.size" description="Header Bottom Border Size" type="length" default="1px" min="0" max="10px"/> <Variable name="header.border.horizontalsize" description="Header Horizontal Border Size" type="length" default="0" min="0" max="10px"/> <Variable name="description.text.size" description="Description Text Size" type="string" default="140%"/> <Variable name="tabs.margin.top" description="Tabs Margin Top" type="length" default="0" min="0" max="100px"/> <Variable name="tabs.margin.side" description="Tabs Side Margin" type="length" default="30px" min="0" max="100px"/> <Variable name="tabs.background.gradient" description="Tabs Background Gradient" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/gradients_light.png)"/> <Variable name="tabs.border.width" description="Tabs Border Width" type="length" default="1px" min="0" max="10px"/> <Variable name="tabs.bevel.border.width" description="Tabs Bevel Border Width" type="length" default="1px" min="0" max="10px"/> <Variable name="post.margin.bottom" description="Post Bottom Margin" type="length" default="25px" min="0" max="100px"/> <Variable name="image.border.small.size" description="Image Border Small Size" type="length" default="2px" min="0" max="10px"/> <Variable name="image.border.large.size" description="Image Border Large Size" type="length" default="5px" min="0" max="10px"/> <Variable name="page.width.selector" description="Page Width Selector" type="string" default=".region-inner"/> <Variable name="page.width" description="Page Width" type="string" default="auto"/> <Variable name="main.section.margin" description="Main Section Margin" type="length" default="15px" min="0" max="100px"/> <Variable name="main.padding" description="Main Padding" type="length" default="15px" min="0" max="100px"/> <Variable name="main.padding.top" description="Main Padding Top" type="length" default="30px" min="0" max="100px"/> <Variable name="main.padding.bottom" description="Main Padding Bottom" type="length" default="30px" min="0" max="100px"/> <Variable name="paging.background" color="#ffffff" description="Background of blog paging area" type="background" default="transparent none no-repeat scroll top center"/> <Variable name="footer.bevel" description="Bevel border length of footer" type="length" default="0" min="0" max="10px"/> <Variable name="mobile.background.overlay" description="Mobile Background Overlay" type="string" default="transparent none repeat scroll top left"/> <Variable name="mobile.background.size" description="Mobile Background Size" type="string" default="auto"/> <Variable name="mobile.button.color" description="Mobile Button Color" type="color" default="#ffffff" /> <Variable name="startSide" description="Side where text starts in blog language" type="automatic" default="left"/> <Variable name="endSide" description="Side where text ends in blog language" type="automatic" default="right"/> */ /* Content ----------------------------------------------- */ body { font: normal normal 12px 'Trebuchet MS', Trebuchet, Verdana, sans-serif; color: #666666; background: #eeeeee none repeat scroll top left; padding: 0 0 0 0; } html body .region-inner { min-width: 0; max-width: 100%; width: auto; } h2 { font-size: 22px; } a:link { text-decoration:none; color: #2b5b84; } a:visited { text-decoration:none; color: #2b5b84; } a:hover { text-decoration:underline; color: #3776ab; } .body-fauxcolumn-outer .fauxcolumn-inner { background: transparent none repeat scroll top left; _background-image: none; } .body-fauxcolumn-outer .cap-top { position: absolute; z-index: 1; height: 400px; width: 100%; } .body-fauxcolumn-outer .cap-top .cap-left { width: 100%; background: transparent none repeat-x scroll top left; _background-image: none; } .content-outer { -moz-box-shadow: 0 0 0 rgba(0, 0, 0, .15); -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .15); -goog-ms-box-shadow: 0 0 0 #333333; box-shadow: 0 0 0 rgba(0, 0, 0, .15); margin-bottom: 1px; } .content-inner { padding: 10px 40px; } .content-inner { background-color: #ffffff; } /* Header ----------------------------------------------- */ .header-outer { background: #2b5b84 none repeat-x scroll 0 -400px; _background-image: none; } .Header h1 { font: normal normal 40px 'Trebuchet MS',Trebuchet,Verdana,sans-serif; color: #000000; text-shadow: 0 0 0 rgba(0, 0, 0, .2); } .Header h1 a { color: #000000; } .Header .description { font-size: 18px; color: #ffd343; } .header-inner .Header .titlewrapper { padding: 22px 0; } .header-inner .Header .descriptionwrapper { padding: 0 0; } /* Tabs ----------------------------------------------- */ .tabs-inner .section:first-child { border-top: 0 solid #dddddd; } .tabs-inner .section:first-child ul { margin-top: -1px; border-top: 1px solid #dddddd; border-left: 1px solid #dddddd; border-right: 1px solid #dddddd; } .tabs-inner .widget ul { background: transparent none repeat-x scroll 0 -800px; _background-image: none; border-bottom: 1px solid #dddddd; margin-top: 0; margin-left: -30px; margin-right: -30px; } .tabs-inner .widget li a { display: inline-block; padding: .6em 1em; font: normal normal 12px 'Trebuchet MS', Trebuchet, Verdana, sans-serif; color: #000000; border-left: 1px solid #ffffff; border-right: 1px solid #dddddd; } .tabs-inner .widget li:first-child a { border-left: none; } .tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover { color: #000000; background-color: #eeeeee; text-decoration: none; } /* Columns ----------------------------------------------- */ .main-outer { border-top: 0 solid #ffd343; } .fauxcolumn-left-outer .fauxcolumn-inner { border-right: 1px solid #ffd343; } .fauxcolumn-right-outer .fauxcolumn-inner { border-left: 1px solid #ffd343; } /* Headings ----------------------------------------------- */ div.widget > h2, div.widget h2.title { margin: 0 0 1em 0; font: normal bold 11px 'Trebuchet MS',Trebuchet,Verdana,sans-serif; color: #000000; } /* Widgets ----------------------------------------------- */ .widget .zippy { color: #999999; text-shadow: 2px 2px 1px rgba(0, 0, 0, .1); } .widget .popular-posts ul { list-style: none; } /* Posts ----------------------------------------------- */ h2.date-header { font: normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif; } .date-header span { background-color: #bbbbbb; color: #ffffff; padding: 0.4em; letter-spacing: 3px; margin: inherit; } .main-inner { padding-top: 35px; padding-bottom: 65px; } .main-inner .column-center-inner { padding: 0 0; } .main-inner .column-center-inner .section { margin: 0 1em; } .post { margin: 0 0 45px 0; } h3.post-title, .comments h4 { font: normal normal 22px 'Trebuchet MS',Trebuchet,Verdana,sans-serif; margin: .75em 0 0; } .post-body { font-size: 110%; line-height: 1.4; position: relative; } .post-body img, .post-body .tr-caption-container, .Profile img, .Image img, .BlogList .item-thumbnail img { padding: 2px; background: #ffffff; border: 1px solid #eeeeee; -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); } .post-body img, .post-body .tr-caption-container { padding: 5px; } .post-body .tr-caption-container { color: #666666; } .post-body .tr-caption-container img { padding: 0; background: transparent; border: none; -moz-box-shadow: 0 0 0 rgba(0, 0, 0, .1); -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .1); box-shadow: 0 0 0 rgba(0, 0, 0, .1); } .post-header { margin: 0 0 1.5em; line-height: 1.6; font-size: 90%; } .post-footer { margin: 20px -2px 0; padding: 5px 10px; color: #666666; background-color: #eeeeee; border-bottom: 1px solid #eeeeee; line-height: 1.6; font-size: 90%; } #comments .comment-author { padding-top: 1.5em; border-top: 1px solid #ffd343; background-position: 0 1.5em; } #comments .comment-author:first-child { padding-top: 0; border-top: none; } .avatar-image-container { margin: .2em 0 0; } #comments .avatar-image-container img { border: 1px solid #eeeeee; } /* Comments ----------------------------------------------- */ .comments .comments-content .icon.blog-author { background-repeat: no-repeat; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg==); } .comments .comments-content .loadmore a { border-top: 1px solid #999999; border-bottom: 1px solid #999999; } .comments .comment-thread.inline-thread { background-color: #eeeeee; } .comments .continue { border-top: 2px solid #999999; } /* Accents ---------------------------------------------- */ .section-columns td.columns-cell { border-left: 1px solid #ffd343; } .blog-pager { background: transparent url(//www.blogblog.com/1kt/simple/paging_dot.png) repeat-x scroll top center; } .blog-pager-older-link, .home-link, .blog-pager-newer-link { background-color: #ffffff; padding: 5px; } .footer-outer { border-top: 1px dashed #bbbbbb; } /* Mobile ----------------------------------------------- */ body.mobile { background-size: auto; } .mobile .body-fauxcolumn-outer { background: transparent none repeat scroll top left; } .mobile .body-fauxcolumn-outer .cap-top { background-size: 100% auto; } .mobile .content-outer { -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, .15); box-shadow: 0 0 3px rgba(0, 0, 0, .15); } .mobile .tabs-inner .widget ul { margin-left: 0; margin-right: 0; } .mobile .post { margin: 0; } .mobile .main-inner .column-center-inner .section { margin: 0; } .mobile .date-header span { padding: 0.1em 10px; margin: 0 -10px; } .mobile h3.post-title { margin: 0; } .mobile .blog-pager { background: transparent none no-repeat scroll top center; } .mobile .footer-outer { border-top: none; } .mobile .main-inner, .mobile .footer-inner { background-color: #ffffff; } .mobile-index-contents { color: #666666; } .mobile-link-button { background-color: #2b5b84; } .mobile-link-button a:link, .mobile-link-button a:visited { color: #ffffff; } .mobile .tabs-inner .section:first-child { border-top: none; } .mobile .tabs-inner .PageList .widget-content { background-color: #eeeeee; color: #000000; border-top: 1px solid #dddddd; border-bottom: 1px solid #dddddd; } .mobile .tabs-inner .PageList .widget-content .pagelist-arrow { border-left: 1px solid #dddddd; } --></style> <style id='template-skin-1' type='text/css'><!-- body { min-width: 960px; } .content-outer, .content-fauxcolumn-outer, .region-inner { min-width: 960px; max-width: 960px; _width: 960px; } .main-inner .columns { padding-left: 0; padding-right: 310px; } .main-inner .fauxcolumn-center-outer { left: 0; right: 310px; /* IE6 does not respect left and right together */ _width: expression(this.parentNode.offsetWidth - parseInt("0") - parseInt("310px") + 'px'); } .main-inner .fauxcolumn-left-outer { width: 0; } .main-inner .fauxcolumn-right-outer { width: 310px; } .main-inner .column-left-outer { width: 0; right: 100%; margin-left: -0; } .main-inner .column-right-outer { width: 310px; margin-right: -310px; } #layout { min-width: 0; } #layout .content-outer { min-width: 0; width: 800px; } #layout .region-inner { min-width: 0; width: auto; } body#layout div.add_widget { padding: 8px; } body#layout div.add_widget a { margin-left: 32px; } --></style> <script type='text/javascript'> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-55961911-3', 'auto', 'blogger'); ga('blogger.send', 'pageview'); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=8520&zx=6eb4518c-c420-4a81-bd87-82582fc5b6e7' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=8520&zx=6eb4518c-c420-4a81-bd87-82582fc5b6e7' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?display=swap&family=Montserrat"></head> <body class='loading'> <div class='navbar section' id='navbar' name='Navbar'><div class='widget Navbar' data-version='1' id='Navbar1'><script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener('load', function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <div id="navbar-iframe-container"></div> <script type="text/javascript" src="https://apis.google.com/js/platform.js"></script> <script type="text/javascript"> gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: 'https://www.blogger.com/navbar/8520?origin\x3dhttps://pyfound.blogspot.com', where: document.getElementById("navbar-iframe-container"), id: "navbar-iframe" }); } }); </script><script type="text/javascript"> (function() { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js'; var head = document.getElementsByTagName('head')[0]; if (head) { head.appendChild(script); }})(); </script> </div></div> <div class='body-fauxcolumns'> <div class='fauxcolumn-outer body-fauxcolumn-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <div class='content'> <div class='content-fauxcolumns'> <div class='fauxcolumn-outer content-fauxcolumn-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <div class='content-outer'> <div class='content-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left content-fauxborder-left'> <div class='fauxborder-right content-fauxborder-right'></div> <div class='content-inner'> <header> <div class='header-outer'> <div class='header-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left header-fauxborder-left'> <div class='fauxborder-right header-fauxborder-right'></div> <div class='region-inner header-inner'> <div class='header section' id='header' name='Header'><div class='widget Header' data-version='1' id='Header1'> <div id='header-inner'> <a href='https://pyfound.blogspot.com/' style='display: block'> <img alt='Python Software Foundation News' height='82px; ' id='Header1_headerimg' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD_WIGHsseqGaGnsXVjcNYZ5g6EIb1XoDEmltAoM6Bi6_R9uDS1BPJP9oPJKj1k4I5R8ALUVZZfy4_DLjEDs6i2GxsCDnf3xO5eo54utZQ5E2pyUhtbQGOiiwBrmLU5asONQ/s1600-r/psf-logo.png' style='display: block' width='334px; '/> </a> <div class='descriptionwrapper'> <p class='description'><span>  News from the Python Software Foundation</span></p> </div> </div> </div></div> </div> </div> <div class='header-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </header> <div class='tabs-outer'> <div class='tabs-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left tabs-fauxborder-left'> <div class='fauxborder-right tabs-fauxborder-right'></div> <div class='region-inner tabs-inner'> <div class='tabs no-items section' id='crosscol' name='Cross-Column'></div> <div class='tabs no-items section' id='crosscol-overflow' name='Cross-Column 2'></div> </div> </div> <div class='tabs-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='main-outer'> <div class='main-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left main-fauxborder-left'> <div class='fauxborder-right main-fauxborder-right'></div> <div class='region-inner main-inner'> <div class='columns fauxcolumns'> <div class='fauxcolumn-outer fauxcolumn-center-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='fauxcolumn-outer fauxcolumn-left-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='fauxcolumn-outer fauxcolumn-right-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <!-- corrects IE6 width calculation --> <div class='columns-inner'> <div class='column-center-outer'> <div class='column-center-inner'> <div class='main section' id='main' name='Main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='blog-posts hfeed'> <div class="date-outer"> <h2 class='date-header'><span>Thursday, May 14, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzfrfmuNHaIQAPZr-IBb22-lBGRbwDo8s-W03maxq0XpC5pFmBwWpqygwDmcw0sliGeiAuD_fspjd_Lh5K3MCWWUGkSXdzPiBA_oTwgczSK8ZayiVMnSSVwekwGJ6mky3Jrg/s1600/zac-profile.jpg' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='7843952111236758088' itemprop='postId'/> <a name='7843952111236758088'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/lightning-talks-part-2.html'>Lightning Talks Part 2 - Python Language Summit 2020</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-7843952111236758088' itemprop='description articleBody'> <br /> <h2>Zac Hatfield-Dodds</h2><h1>Teaching Python with Errors</h1><br /> <div id="gdcalert1"></div><br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzfrfmuNHaIQAPZr-IBb22-lBGRbwDo8s-W03maxq0XpC5pFmBwWpqygwDmcw0sliGeiAuD_fspjd_Lh5K3MCWWUGkSXdzPiBA_oTwgczSK8ZayiVMnSSVwekwGJ6mky3Jrg/s1600/zac-profile.jpg" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzfrfmuNHaIQAPZr-IBb22-lBGRbwDo8s-W03maxq0XpC5pFmBwWpqygwDmcw0sliGeiAuD_fspjd_Lh5K3MCWWUGkSXdzPiBA_oTwgczSK8ZayiVMnSSVwekwGJ6mky3Jrg/s1600/zac-profile.jpg" /></a><br /> When a new coder begins learning Python, the first Python feature they usually see is <code>SyntaxError</code>. In Zac Hatfield-Dodds's experience, novices meet these errors practically as soon as they start typing, and they will spend most of their time over the following months struggling with them. Since experienced programmers rarely encounter syntax errors and easily fix them, the core team has not built very good tooling for them, and the <a href="https://docs.python.org/3/tutorial/errors.html#syntax-errors">official Python tutorial</a> doesn't cover errors until Section 8. In any case, documentation is not the place to fix novices' user experience, since they don't know where to look for help. The only place to fix it is in CPython.<br /> <br /> <a href="https://pyfound.blogspot.com/2020/04/the-2020-python-language-summit.html">Read more 2020 Python Language Summit coverage</a>.<br /> <hr><code>SyntaxError</code> does little to help a beginner. It directs their attention to the spot <em>after</em> the token that caused the error. In this example from the tutorial, the caret points at the last letter of <code>print</code>, but the coder's mistake was omitting a colon after <code>True</code>:<br /> <pre class="prettyprint">>>> while True print('Hello world') File "&lt;stdin>", line 1 while True print('Hello world') ^ SyntaxError: invalid syntax</pre><pre class="prettyprint"></pre>Hatfield-Dodds proposed more precise errors that tell users about mismatched parentheses, unterminated string literals, missing commas and colons, and so on. Pablo Galindo Salgado said, via Zoom chat, that Python 3.8 has improved some error messages, for example:<br /> <pre class="prettyprint">>>> (1+3+4)) File "&lt;stdin>", line 1 (1+3+4)) ^ SyntaxError: unmatched ')'</pre><pre class="prettyprint"></pre>The <a href="https://pyfound.blogspot.com/2020/04/replacing-cpythons-parser-python.html">new parser for 3.9</a> might improve error messages further, although in the short term <a href="https://github.com/we-like-parsers/cpython/issues/84">it requires more work just to bring it to parity with the current parser</a>.<br /> <br /> Hatfield-Dodds suggested CPython could implement "did you mean..." for both SyntaxErrors and NameErrors, by fuzzily searching for replacements for typos. Incremental improvements to SyntaxError could be funded by educational institutions, he guessed, and would make a good project for contributors from outside the core team, if the core developers are willing to guide them. "I care a lot about this," said Hatfield-Dodds, and paused to let out a big exhale. "If people's first exposure to errors in Python is an error that tells them what the problem is and how to fix it, we might even convince them to read error messages in the future, which would be magical."<br /> <br /> <h2>Jim Baker</h2><h1>State of Jython</h1><br /> <div id="gdcalert2"></div><br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNCNkHYRKTdyhRVkQLZ0Awqsx-i4-Bv95TqK2xG13cfAaOiM0EqrydDP_XI3AM_ZihhZ-tiz0grjsfNP5xUk45yqNhd5Bef_KVwHzGY-M8rbpXT5EO9mVDQqr7mOTd_mJyng/s1600/jim-baker-speaker-photo.jpg" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNCNkHYRKTdyhRVkQLZ0Awqsx-i4-Bv95TqK2xG13cfAaOiM0EqrydDP_XI3AM_ZihhZ-tiz0grjsfNP5xUk45yqNhd5Bef_KVwHzGY-M8rbpXT5EO9mVDQqr7mOTd_mJyng/s1600/jim-baker-speaker-photo.jpg" /></a><br /> "We are not dead yet!" said Jim Baker to the Language Summit. He admitted that "this is something I've said many times about Jython in the past." The project is certainly behind CPython—it has just published a bugfix release of 2.7, and Python 3 support is far off—but it is making progress nevertheless. "And again," said Baker, "our apologies."<br /> <br /> Jython's previous bugfix release was nearly two years ago; the main topics of the latest version, Jython 2.7.2, were an overhaul Jython's PyJavaType objects, and solutions to deep race conditions. Baker said there is still an active user base for Jython based on the response to Jython's recent betas, but "capacity in the project is low." The project is currently led by Jeff Allen with two other regular contributors, none devoted to Jython full-time. Emeritus developers chip in occasionally. Baker hopes there will be more interest once Jython 3 ships, but he wrote in his slides, "the journey is unpredictable and resources are few."<br /> <br /> There are several Python 3 implementations on the JVM, but none is ready to use. Isaiah Peng made <a href="https://github.com/jython/jython3/tree/py3k">a solo attempt at implementing Jython 3</a> in 2016-2017. It is too late now to resume this work, because Peng's branch didn't pull changes from the main Jython repository and they have now diverged too far. Baker said Jython should copy ideas from this prototype and credit Peng's work. Since 2016, Jeff Allen has been writing the <a href="https://the-very-slow-jython-project.readthedocs.io/en/latest/">Very Slow Jython Project</a>, "a project to re-think implementation choices in the Jython core, through the gradual, narrated evolution of a toy implementation." Independently of the Jython team, Oracle is actively building <a href="https://github.com/graalvm/graalpython">an experimental Python 3 implementation</a> on the Graal (pronounced "grail") JVM. "It's fantastic," said Baker, but unlike Jython "it doesn't do this beautiful subclassing of Java classes with Python classes."<br /> <br /> The plan for Jython is to target the Python 3.8 language, including type hints. Baker has prototyped <a href="http://github.com/jimbaker/jstubgen">code to generate Python type hints from Java classes</a>. The team will overhaul the core implementation using modern Java features, and continue to emphasize Jython's strengths: convenient integration with Java libraries, speed equal to CPython or better, and high concurrency (unlike CPython). Baker speculated that Jython 3.8's asyncio module could be built on the high-performance <a href="https://netty.io/">Netty</a> library. He hopes that the new <a href="https://pyfound.blogspot.com/2020/04/hpy-future-proof-way-of-extending.html">HPy</a> API will take off, because it would simplify supporting C extensions from Jython.<br /> <br /> <h2>Eric Holscher</h2><h1>Read the Docs features of interest </h1><br /> <div id="gdcalert3"></div><br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgASoLf3u_iQj-2OETnvH8rgpxsmGZC808ecjV-9bGD4E_z0a5kIF1PY6R7rQm05RzqIWTKaSjEAB2qYZT52SzUoEzEuPhooMkTvzhzpTx0DaKHMAFHTJpJgoBcCinWmdivzQ/s1600/eric-holscher.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgASoLf3u_iQj-2OETnvH8rgpxsmGZC808ecjV-9bGD4E_z0a5kIF1PY6R7rQm05RzqIWTKaSjEAB2qYZT52SzUoEzEuPhooMkTvzhzpTx0DaKHMAFHTJpJgoBcCinWmdivzQ/s1600/eric-holscher.png" /></a><br /> Holscher's presentation was an advertisement for nifty additions to <a href="https://readthedocs.org/">ReadTheDocs</a>, and an enticement to move CPython's documentation there.<br /> <br /> ReadTheDocs recently added the <a href="https://sphinx-hoverxref.readthedocs.io/en/latest/">hoverxref</a> feature; when a reader hovers their cursor over a link in a documentation page, a tooltip shows the content of the linked section. Holscher has <a href="https://cpython-ericholscher.readthedocs.io/en/sphinx-hoverxref/whatsnew/3.9.html">forked the CPython docs</a> to host them on ReadTheDocs and demonstrate this feature's utility.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfUeGaUlWgB5rFFSrGh1Httr9H_ElJFBV4LZsw41sla5SfsyIeo8IZSZXOJdTDfCuWIB3V6juOXhclfISq54KDm5oFM3LzybCbv5EGaFBvt4_aYRGpqgtDtcDMCLIeC4VQPQ/s1600/hover-xref-cpython.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfUeGaUlWgB5rFFSrGh1Httr9H_ElJFBV4LZsw41sla5SfsyIeo8IZSZXOJdTDfCuWIB3V6juOXhclfISq54KDm5oFM3LzybCbv5EGaFBvt4_aYRGpqgtDtcDMCLIeC4VQPQ/s1600/hover-xref-cpython.png" /></a><br /> ReadTheDocs also has nicer pull request integration than the CPython repository does. Currently, when contributors offer pull requests to CPython, the patched documentation is available for download as a zip archive of HTML files. ReadTheDocs goes one better; <a href="https://blog.readthedocs.com/building-docs-for-pull-requests/">its PR builder publishes the patched docs to the web for review</a>. Search engines are blocked from indexing these docs, and each page displays a warning that it was created from a pull request. (After the Summit, at the core developers' request, the ReadTheDocs team enabled this feature for pull requests to the <a href="https://github.com/python/devguide">Python Developer Guide</a>, which is hosted on ReadTheDocs.)<br /> <br /> Finally, Holscher claimed that ReadTheDocs's text search is better than what CPython uses, which is generated by <a href="http://sphinx-doc.org/">Sphinx</a>. ReadTheDocs's search results include direct links to pages' subsections, and they provide <a href="https://blog.readthedocs.com/improved-search-and-search-as-you-type/">search-as-you-type</a>.<br /> <br /> Sanyam Khurana commented via Zoom chat, "This looks very promising and amazing!" Pablo Galindo Salgado suggested hosting the PEPs on ReadTheDocs as well.<br /> <br /> "Some of this is beta," said Holscher. Nevertheless, it's exciting to consider how much better the reader experience would be if CPython migrated. He argued that CPython should benefit from future improvements in ReadTheDocs, and ReadTheDocs should benefit from the attention of CPython developers. "We’ve talked about this in the past, there were blockers," he said, but the ReadTheDocs team has now addressed them.<br /> <br /> <h2>Mariatta Wijaya</h2><h1>Make your life happier (with Zapier)</h1><br /> <div id="gdcalert5"></div><br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpm-cqyS3pccke5A33eSlaokWKqssoo2DtBYlpJvr3EVmB3YzdGhAGKA6VXs03xHGFmmYBdbE5XR7JtGJ-VEqMVYAfpC4-Lx-QqgaNWzhjBy7Kznzlyy-0jjeW3woNUlcYow/s1600/wijaya.jpg" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpm-cqyS3pccke5A33eSlaokWKqssoo2DtBYlpJvr3EVmB3YzdGhAGKA6VXs03xHGFmmYBdbE5XR7JtGJ-VEqMVYAfpC4-Lx-QqgaNWzhjBy7Kznzlyy-0jjeW3woNUlcYow/s1600/wijaya.jpg" /></a><br /> "I want you all to do more automation in your lives," said Mariatta Wijaya. She acknowledged that Zapier is her employer, but her intention was pure. "I know you're volunteering for open source. You should use more automation and save time."<br /> <br /> For a demonstration, Wijaya showed the Zapier workflow she had used to invite attendees to the Language Summit. "You all received calendar invites for this event," she said. "I did not send them by going to Google Calendar." Instead, she collected names and email addresses in a Google spreadsheet. For each attendee, once she obtained a recording waiver and consent to the code of conduct, she put a "y" in the attendee's row in the spreadsheet. Her <a href="https://zapier.com/learn/getting-started-guide/what-is-zapier/">Zap</a> then sent the invite automatically.<br /> <br /> <div id="gdcalert6"></div><br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEjTsihzfHVD3mHbxViB-X3bzSiIMwuo3vUKfxmaQ6Tpa_05l0XUpqYCSC5rtsO-ecvCBTINp70OH9PnvTHo7k7IqAciCjuMBrHeCSfId5wZQkFIGAxpFkqVNAjexTHWK_tA/s1600/zapier.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEjTsihzfHVD3mHbxViB-X3bzSiIMwuo3vUKfxmaQ6Tpa_05l0XUpqYCSC5rtsO-ecvCBTINp70OH9PnvTHo7k7IqAciCjuMBrHeCSfId5wZQkFIGAxpFkqVNAjexTHWK_tA/s1600/zapier.png" /></a><br /> Earlier in the summit, some core developers had complained about <a href="https://pyfound.blogspot.com/2020/05/core-workflow-updates-python-language.html">the firehose of Discourse emails</a>. Zapier has a Discourse integration that can manage this torrent. A user can create a "Zap" that takes new Discourse messages, filters them according to keywords or other attributes the user chooses, then triggers an email, Slack notification, or some other action. Wijaya also described how Zapier automates onboarding new PyLadies organizers.<br /> <br /> <h1>Conclusion</h1>"Well, we made it," said 艁ukasz Langa at the end of the second day of the videoconference. "I'm sorry it was not what a real Python Language Summit could have been, but I hope it was better than nothing." His co-organizer Mariatta Wijaya congratulated attendees from all over the globe for staying up. "I know this is past bed time for many of you." It was 8pm Pacific Time, the middle of the night for attendees in Europe and Africa, and the morning of the next day in Asia. She thanked the PSF and PyCon staff, and MongoDB for sponsoring the Summit.<br /> <br /> Victor Stinner added, "Thanks TCP/IP for making this possible."<br /> <br /> Sumana Harihareswara said, "This was real to me." <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08612435176546178055' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08612435176546178055' rel='author' title='author profile'> <span itemprop='name'>A. Jesse Jiryu Davis</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/lightning-talks-part-2.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/lightning-talks-part-2.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-14T13:46:00-04:00'>5/14/2020 01:46:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-947433767'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=7843952111236758088&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Wednesday, May 13, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='8520' itemprop='blogId'/> <meta content='3674863701619055948' itemprop='postId'/> <a name='3674863701619055948'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/call-for-volunteers-python-github.html'>Call for Volunteers! Python GitHub Migration Work Group </a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-3674863701619055948' itemprop='description articleBody'> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; text-size-adjust: auto;"> Call for community volunteers! It is time to assemble a Python Work Group that will aid in Python’s migration to GitHub!</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <a href="https://www.python.org/dev/peps/pep-0581/" style="-webkit-print-color-adjust: exact; color: #4183c4;">PEP 581</a><span class="Apple-converted-space"> </span>was accepted and Python is now starting to plan for the actual migration (per<span class="Apple-converted-space"> </span><a href="https://www.python.org/dev/peps/pep-0588/" style="-webkit-print-color-adjust: exact; color: #4183c4;">PEP 588</a>)!</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> We are looking for volunteers to participate in a work group that will be involved with Python’s migration from bugs.python.org to GitHub. We want to make sure the directions this migration takes represents what the community needs!</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> The transition will be completed with the assistance of GitHub’s team and<span class="Apple-converted-space"> </span><a href="http://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html" style="-webkit-print-color-adjust: exact; color: #4183c4;">the PSF will be contracting a Technical Project Manager to assist</a>. Certain Steering Council members and PSF staff members will be part of this work group as well!</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> The work group will help review contractor resumes, weigh in on discussions, help guide decisions, help get community input, and have a close overview of the entire project. If you have experience with Roundup and GitHub we want to hear from you! We want to ensure that through this Work Group we have a wide range of users represented. The discussions and decisions will help mold what the final outcome will be.</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-top: 15px; text-size-adjust: auto;"> Fill out this application form by May 27:<span class="Apple-converted-space"> </span><a href="https://forms.gle/jivuUdgViQPU4rKh8" style="-webkit-print-color-adjust: exact; color: #4183c4;">https://forms.gle/jivuUdgViQPU4rKh8</a>. We will reach out soon after.</div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/18334325508115717169' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/18334325508115717169' rel='author' title='author profile'> <span itemprop='name'>Ewa Jodlowska</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/call-for-volunteers-python-github.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/call-for-volunteers-python-github.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-13T16:53:00-04:00'>5/13/2020 04:53:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-771879458'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=3674863701619055948&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6bIS0Id4Zp6-ToKe9HdIZbyZwm3XYEi7QQEb6AGvyUB4JjLl0fcsV43-krvXd9uoM_phV5uKUOrWU3ZchCXcrNZho9UNDkrbS22PJstw2UazLcoHokWbMan2YuN1G1Ed9UQ/s320/iStock-1136011446.jpg' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='2725215464914587809' itemprop='postId'/> <a name='2725215464914587809'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/6-ways-salesforce-gets-things-done-with.html'>6 Ways Salesforce Gets Things Done with Python</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-2725215464914587809' itemprop='description articleBody'> <h3> Salesforce Engineering puts Python to work across many areas of their business. </h3> Read on to see how they use python in machine learning, security, internal devops teams and more.<br /> <br /> The Python programming language has strong ties to both engineering and science disciplines, which gives its users access to a wide number of libraries to solve both practical and theoretical problems. We put it to work across Salesforce.org (our non-profit product arm), Heroku, Salesforce Einstein, Industries and Service Clouds, internal devops teams, and more.<br /> <div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6bIS0Id4Zp6-ToKe9HdIZbyZwm3XYEi7QQEb6AGvyUB4JjLl0fcsV43-krvXd9uoM_phV5uKUOrWU3ZchCXcrNZho9UNDkrbS22PJstw2UazLcoHokWbMan2YuN1G1Ed9UQ/s1600/iStock-1136011446.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1024" data-original-width="1024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6bIS0Id4Zp6-ToKe9HdIZbyZwm3XYEi7QQEb6AGvyUB4JjLl0fcsV43-krvXd9uoM_phV5uKUOrWU3ZchCXcrNZho9UNDkrbS22PJstw2UazLcoHokWbMan2YuN1G1Ed9UQ/s320/iStock-1136011446.jpg" width="320" /></a></div> <br /></div> <div> <h4> Here are 6 things we use Python to do (and you can too!) through projects we’ve open sourced:</h4> <div> <br /></div> <div> <b>1. Conquer the Natural Language Decathlon by performing ten disparate natural language tasks (<a href="http://decanlp.com/">DecaNLP</a>).</b></div> <div> <br /> <i>Deep learning has significantly improved state-of-the-art performance for natural language processing (NLP) tasks, but each one is typically studied in isolation. The Natural Language Decathlon (decaNLP) is a new benchmark for studying general NLP models that can perform a variety of complex, natural language tasks. By requiring a single system to perform ten disparate natural language tasks, decaNLP offers a unique setting for multitask, transfer, and continual learning.</i></div> <div> <i><br /></i></div> <div> <b>2. Create SSL/TLS client fingerprints that are easy to produce on any platform and can be easily shared for threat intelligence (<a href="https://github.com/salesforce/ja3">JA3</a>).</b></div> <div> <br /> <i>JA3 gathers the decimal values of the bytes for the following fields in the Client Hello packet; SSL Version, Accepted Ciphers, List of Extensions, Elliptic Curves, and Elliptic Curve Formats. It then concatenates those values together in order, using a “,” to delimit each field and a “-” to delimit each value in each field.</i></div> <div> <i><br /></i><b>3. Use Google Sheets like tables in code (<a href="https://github.com/salesforce/pygsheetsorm">pygsheetsorm</a>).</b></div> <div> <i><br /></i></div> <div> <i>Ever wanted to be able to use a Google Sheet like a table in your code? How about if you could get a list of objects that automatically mapped column headers into properties? Then this project is for you! This is a simple interface on top of <a href="https://pygsheets.readthedocs.io/en/stable/">pygsheets</a>.</i></div> <div> <i><br /></i></div> <div> <b>4. Get rid of silent errors in Perforce syncs (<a href="https://github.com/salesforce/o4">o4</a>).</b></div> <div> <b><br /></b></div> <div> <i>At Salesforce, we use Perforce at a very large scale. A scale that exposes some shortcomings in p4 itself. o4 was created to improve reliability of a sync and increase scalability in our very large-scale CI. What that boils down to is the rather horrendous reality that a p4 sync makes most of the changes to your local files. o4 allows you to continue using Perforce and all the associated tools and IDE plugins, without the uncertainty around a sync. Every sync is guaranteed perfect, every single time. In the rare occurrence that a sync could not be met to 100%, o4 will fail loudly. Crash and burn. No more silent errors! In addition to that, o4 allows some dramatic improvements to CI.</i></div> <div> <i><br /></i><b>5. Automatically verify, de-duplicate, and suggest payouts for vulnerability reports through HackerOne (<a href="https://github.com/salesforce/AutoTriageBot">AutoTriageBot</a>).</b></div> <div> <b><br /></b></div> <div> <i>This bot can automatically verify reports about XSS, SQLi, and Open Redirect vulnerabilities (via both GET and POST). In addition, it is built in a modular manner so that it can be easily expanded to add tests for other classes of vulnerabilities.</i></div> <div> <i><br /></i><b>6. Run continuous integration from the command line for Salesforce Managed Package applications (<a href="https://github.com/SFDO-Tooling/CumulusCI">CumulusCI</a>).</b></div> <div> <br /> <i>Out of the box, CumulusCI provides a complete best practice development and release process based on the processes used by Salesforce.org to build and release managed packages to thousands of users. It offers a flexible and pluggable system for running tasks (single actions) and flows (sequences of tasks) and an OAuth-based org keychain allowing easy connection to Salesforce orgs and stored in local files using AES encryption.</i></div> </div> <div> <i><br /></i></div> <div style="text-align: center;"> <h4> <i><b>. . .</b></i></h4> </div> <div style="text-align: center;"> <br /></div> <div style="text-align: left;"> Still want more Python? Check out all of the Salesforce <a href="https://github.com/salesforce?utf8=%E2%9C%93&q=&type=&language=python">Open Source projects built in Python </a>on GitHub.</div> <div style="text-align: left;"> <i><br /></i></div> <div style="text-align: left;"> <div style="font-style: italic;"> WRITTEN BY</div> <div style="font-style: italic;"> <br /></div> <div> Laura Lindeman</div> <div> Voracious reader & crafter of words. organizer extraordinaire. #peoplegeek at Salesforce on the Tech & Products Innovation & Learning team. </div> </div> <div style="text-align: center;"> <br /></div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/11931343676066539740' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/11931343676066539740' rel='author' title='author profile'> <span itemprop='name'>Betsy Waliszewski</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/6-ways-salesforce-gets-things-done-with.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/6-ways-salesforce-gets-things-done-with.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-13T12:13:00-04:00'>5/13/2020 12:13:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-536116824'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=2725215464914587809&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidfEZ_EqLnq3wzvLL2jcI6-wiEDoFZ_zBS1yTRLtBw6uTTTYpsokrDScCTNnwMmx4jWTueD6d83yVUftCw6ukIZ8QSYz9cToYTSN2so64OyQCNUY57ML9QKGq_tSCf9x1DzQ/s400/PythonHeaderFINAL+copy.jpg' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='4608270435295525066' itemprop='postId'/> <a name='4608270435295525066'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/capital-one-lessons-from-adopting.html'>Capital One - Lessons From Adopting Python as a Team </a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-4608270435295525066' itemprop='description articleBody'> By Akshay Prabhu, Software Engineering Manager, Capital One<br /> <br /> <h3> Rewriting Legacy ETL Jobs in Python When You’re Not Python Devs</h3> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidfEZ_EqLnq3wzvLL2jcI6-wiEDoFZ_zBS1yTRLtBw6uTTTYpsokrDScCTNnwMmx4jWTueD6d83yVUftCw6ukIZ8QSYz9cToYTSN2so64OyQCNUY57ML9QKGq_tSCf9x1DzQ/s1600/PythonHeaderFINAL+copy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="478" data-original-width="974" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidfEZ_EqLnq3wzvLL2jcI6-wiEDoFZ_zBS1yTRLtBw6uTTTYpsokrDScCTNnwMmx4jWTueD6d83yVUftCw6ukIZ8QSYz9cToYTSN2so64OyQCNUY57ML9QKGq_tSCf9x1DzQ/s400/PythonHeaderFINAL+copy.jpg" width="400" /></a></div> <div> <br /></div> <div> <div> So how does a team of six engineers - heavily experienced in web development in languages like ReactJS, NodeJs, and Java - go about adopting Python into their work?</div> <div> <br /></div> <div> The application development and cloud computing technology landscape is always changing and an important part of our role as engineers is to stay up to date on those changes. Sometimes it is through solo work - such as learning a new framework or skill. But sometimes it is through team-based work - such as adopting and migrating a whole project to a new language. </div> <div> <br /></div> <div> Like most other engineers, I’ve experienced this kind of team-based work multiple times in my career, and I recently went through it in my current role as a Software Engineering Manager at Capital One. In my role I am working on leading a team of engineers to develop highly scalable web applications, including both API and UI layers. As part of our journey to migrate applications to the cloud, we were also involved in rewriting a lot of legacy <a href="https://en.wikipedia.org/wiki/Extract,_transform,_load">ETL</a> jobs originally built using licensed tools. Most of my past engineering experience before these re-write efforts for ETL was around NodeJS, Java, and Ruby on Rails; and until a year ago I had not worked with Python. The same was true with most of the engineers on my team.</div> <div> <br /></div> <div> <i>In fact, our entire team consisted of experienced engineers who have delivered multiple web and distributed applications in the cloud, but none had exposure to ETL or data-driven projects.</i></div> <div> <br /></div> <div> About one month into the rewrite efforts we were hitting limitations around using Java to migrate legacy system code. We wanted to be able to achieve simple File Operations, as well as complicated queries using Spark, but with dynamically typed language and minimal bootstrap code. This was one of our reasons for considering whether it was time to switch languages.</div> </div> <div> <br /></div> <h3> Why Did We Decide On Python?</h3> <div> <br /></div> <div> <div> For our project, we faced the huge task of re-writing multiple jobs running on a legacy ETL platform. This involved enterprise API integrations, as well as complex data analysis and refinement.</div> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsXPMMzaLWjzNVDXvujbMmjp34heeojwGblYFd9V1gq1CXrznfg3a6BEI7svVMgB8z5blrR00ofyubrKRANAMvhLZD-A8UFAfAzQCGnyJod3zs-ZP24za7aF2pjjrKNTw5HA/s1600/AkshayDiagram1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="172" data-original-width="1194" height="56" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsXPMMzaLWjzNVDXvujbMmjp34heeojwGblYFd9V1gq1CXrznfg3a6BEI7svVMgB8z5blrR00ofyubrKRANAMvhLZD-A8UFAfAzQCGnyJod3zs-ZP24za7aF2pjjrKNTw5HA/s400/AkshayDiagram1.jpg" width="400" /></a></div> <div> <br /></div> <div> <b>Inflexibility of Existing Languages</b></div> <div> <b><br /></b></div> <div> Due to the nature of these jobs, none of the languages we were most experienced with were a great choice. That’s because they were:</div> <div> <ul> <li>Static typed languages like Java </li> <li>Involved heavy bootstrap code </li> <li>Lacked extensive support for data manipulation libraries such as Pandas</li> <li>Lacked extensive external community support for Spark integrations or data analysis</li> </ul> </div> <div> <br /></div> <div> <b>Flexibility with Python: API Integration, Data Analysis, and Others</b></div> <div> <b><br /></b></div> <div> Python seemed to be a good choice for us as it was flexible enough to support a wide array of use cases. It also fit in well as it was:</div> <div> <ul> <li>Dynamically typed</li> <li>Supported re-writing Bash based or ETL jobs in fewer lines of code</li> <li>Had a well supported REST interface </li> <li>Had excellent support for data manipulation libraries such as Pandas and Spark</li> </ul> </div> <div> <br /></div> <div> There were a few other areas that really cemented our use of Python - these were <i>File Operations and Community Support.</i></div> </div> <div> <br /></div> <div> <div> <b>File Operations</b></div> <div> <b><br /></b></div> <div> File Operations were key to our project as our process involved reading multiple source files</div> <div> in parquet format, extracting, refining, and producing new files. We needed a language that could easily integrate with <a href="https://spark.apache.org/docs/latest/api/python/index.html">SPARK on HDFS</a> for complicated and larger datasets, as well as an equally powerful library for smaller datasets like <a href="https://pypi.org/project/pandas/">Pandas</a>. Hence, File Operations were at the center of our re-write. </div> <div> <br /></div> <div> Python worked well in both cases, including:</div> <div> <ul> <li>Well suited for simple file manipulations using Pandas</li> <li>Worked in complex scenarios using Spark Queries on HDFS</li> <li>Needed significantly fewer lines of code to accomplish this than in Java or NodeJS</li> <li>Could work for File Operations in memory when source files are few MBs </li> <li>Simple enough to make API calls for various Enterprise Layers</li> </ul> </div> <div> <br /></div> <div> <b>Community Support</b></div> <div> <b><br /></b></div> <div> As we were assessing adopting a new language, Community Support both within Capital One and without was a key for us. We wanted a language which was well supported by an active open source community that:</div> <div> <ul> <li>Constantly updates security enhancements</li> <li>Resolves outstanding questions or issues</li> <li>Actively merges new feature requests from engineers </li> </ul> </div> <div> Outside of Capital One</div> <div> <ul> <li>Python has a much more extensive community of engineers in the Data Analysis space as compared to Java</li> <li>PySpark has much better support than Spark Integration with Java</li> </ul> <div> <br /></div> </div> </div> <div> <div> <b>Within Capital One</b></div> <div> <ul> <li>Capital One has a very active community of Python engineers and experts to help teams get started and maintain their Python projects</li> <li>This internal community allowed us to seek guidance, as well as go through multiple code reviews</li> </ul> </div> <h3> How We Got Started with Python</h3> <div> Like any other programming language, we started by defining our source of truth for standards. We went with <a href="https://www.python.org/dev/peps/pep-0008/">PEP8</a> which is the standard that defines Coding Style Guides for Python. </div> <div> We went through the below key stages from Planning to Production.</div> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8Ly1mjdC70pxE3kTMSiD5Dynk4lG-NG_QmdQPtIdfZmntpTU4qAIEO9edWJkJFOjnDcTNdYUDroLID-RWnnM86lIyH1T_E_b-XIHomZ-fJGwOP-XfBsBavdTz0m0qWi3mow/s1600/AkshayDiagram2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="418" data-original-width="1052" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8Ly1mjdC70pxE3kTMSiD5Dynk4lG-NG_QmdQPtIdfZmntpTU4qAIEO9edWJkJFOjnDcTNdYUDroLID-RWnnM86lIyH1T_E_b-XIHomZ-fJGwOP-XfBsBavdTz0m0qWi3mow/s400/AkshayDiagram2.jpg" width="400" /></a></div> <div> <br /></div> <div> <i>Key to learning and adopting a new language was putting in time for foundational work; automating compliance with PEP8 and adopting Py Tooling like Black and Flake8.</i></div> <div> <br /></div> <div> Let’s go through some of the key elements to these stages.</div> <div> <br /></div> <div> <div> <b>Define Standards and Automating Adoption</b></div> <div> <b><br /></b></div> <div> As our team was new to Python, we spent the first initial few days defining standards on how we would code to comply with PEP8. But in addition to adoption, we needed to automate our workflow to comply with these standards.</div> <div> <ul> <li>Added a Pre-Commit Hook for Black which automatically formats code on local commits.</li> <li>Black didnt catch all violations, which is where Flake8 came in.</li> <li>Flake 8 installed as a Pre-Commit hook stopped any code commits where there were outstanding compliance errors with PEP8.</li> </ul> </div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggQa0w49iTZI4pfThdwZ0xrX7zGgUOceW9I50Up7M8Bh75h6eDtzdBW0BO4lHIh6bP_hDWEKOSd4NXa52JZrP3UMsm4kqTZEhfgApjGoiT2iwF42TJTm5HjbFAssn7m_2vWw/s1600/AkshayDiagram3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="172" data-original-width="936" height="72" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggQa0w49iTZI4pfThdwZ0xrX7zGgUOceW9I50Up7M8Bh75h6eDtzdBW0BO4lHIh6bP_hDWEKOSd4NXa52JZrP3UMsm4kqTZEhfgApjGoiT2iwF42TJTm5HjbFAssn7m_2vWw/s400/AkshayDiagram3.jpg" width="400" /></a></div> <div> <br /></div> <div> After automating our workflow to comply with standards and a base repo, we started with the core dev work.</div> <div> <br /></div> <div> <b>Logging</b></div> <div> <b><br /></b></div> <div> This was key given Python is dynamically typed; logging was our solution to better track problems.</div> <div> <br /></div> <div> <ul> <li>As a Team we Decided on a common Logging format:</li> </ul> </div> <div> <br /></div> <div style="text-align: left;"> ``` Code Block</div> <div style="text-align: left;"> requestid - machine_instanceid</div> <div style="text-align: left;"> timestamp - YYYY-MM-DD HH:MM:SS,milliseconds</div> <div style="text-align: left;"> loglevel - INFO, ERROR</div> <div style="text-align: left;"> modulename - function_name</div> <div style="text-align: left;"> state - START/END/INPROGRESS</div> <div style="text-align: left;"> type - SCRIPT/EXTERNAL_API/etc.</div> <div style="text-align: left;"> modresponse - Success/Error</div> <div style="text-align: left;"> duration - Tracking External API calls</div> <div style="text-align: left;"> message - custom message as needed</div> <div style="text-align: left;"> errormessage - err message</div> <div> ```</div> <div> <ul> <li>We leveraged the <a href="https://www.elastic.co/elastic-stack?ultron=%255BEL%255D-%255BB%255D-%255BAMER%255D-US+CA-Exact&blade=adwords-s&Device=c&thor=elk%2520stack&gclid=CjwKCAiAhc7yBRAdEiwAplGxX7QiZed0XB7pdALZx5FOKZo_IiRGXsWi48uOBUUQ12g6eRy9Y5uC0xoCLO4QAvD_BwE">ELK</a> stack (Elasticsearch, Logstash, and Kibana) for logging.</li> <li>By using Kibana as the Web Application UI for our logs, we could see our execution details as well as trace down exceptions in Kibana.</li> </ul> </div> </div> <div> <div> <b>Critical takeaways</b></div> <div> <ul> <li>Adopting a simple library called <a href="https://realpython.com/python-requests/">requests</a> to handle our API calls.</li> <li>Spark v/s Pandas: When you perform operations on a dataframe in Spark, a new dataframe/reference is created which is by design. This works well with large datasets but is a hindrance when the dataset is smaller. Hence for filtered smaller datasets under 5MB, we decided to go with Pandas for quick data frame manipulations. </li> <li>Automation for compliance to coding standards was a huge time saver as most of our team was new to Python.</li> <li>We quickly realized for us to test along with all the dev work, we needed a TDD approach where<a href="https://docs.pytest.org/en/latest/"> pytest</a> came into our workspace. This proved extremely helpful.</li> </ul> </div> </div> <div> <h3> Was it Worth the Effort?</h3> <div style="text-align: center;"> <i>In addition to being the right choice of tool for our job, exploring and learning Python allowed the team to work more closely together and bond more than ever. </i></div> <div style="text-align: center;"> <i>We as a team learned something new together and solved multiple issues as we hit walls; which took our team bonding to great heights!</i></div> <div> <br /></div> <div> Given the nature of our project, Python did fit in very well. It’s dynamically typed and the libraries are feature-rich, working for both simple API calls as well as complex operations around data transformation and filtering. As engineers, we worked together as a team to “learn how to learn” and adopt a new language the right way. With the help of Capital One’s Python Gurus, we adopted all the best practices for developing a working production application and delivered this project before the committed deadline. I am lucky to be part of such an awesome team, as well as to work with Capital One Python experts like <a href="https://medium.com/capital-one-tech/search?q=steven%2520lott">Steven Lott</a>, which was critical for getting us across the finish line. </div> <div> <br /></div> <div> <br /></div> <div> I hope this has been helpful and would love to learn what languages you and your team have adopted recently; especially in data-driven projects like this, let me know in the comments!</div> <div> <br /></div> <div> Resources</div> <div> <br /></div> <div> <a href="https://spark.apache.org/docs/latest/api/python/index.html">PySpark </a></div> <div> <a href="https://pandas.pydata.org/">Pandas</a></div> <div> <br /></div> <div style="text-align: center;"> ***</div> <div style="text-align: center;"> <i>These opinions are those of the author. Unless noted otherwise in this post, Capital One is not affiliated with, nor is it endorsed by any of the companies mentioned. All trademarks and other intellectual property used or displayed are the ownership of their respective owners. This article is © 2020 Capital One.</i></div> </div> <div style="text-align: center;"> <br /></div> </div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/11931343676066539740' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/11931343676066539740' rel='author' title='author profile'> <span itemprop='name'>Betsy Waliszewski</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/capital-one-lessons-from-adopting.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/capital-one-lessons-from-adopting.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-13T12:13:00-04:00'>5/13/2020 12:13:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-536116824'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=4608270435295525066&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Sunday, May 10, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXo114_hvreDvjw-I9grLq8Hy69mgvunGq8YZbNOVZ0kmbC5Jg3A_Xhjc317AQdfV2dtF6ie13PQNQ1TCYI8qewOWwBKYe0AVYeUJDTTlF-RdfJmnFrkazBDEdsc3ZMA-KJw/s1600/rusty-mugshot-djangocon-us-2018.jpg' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='3071804203640664359' itemprop='postId'/> <a name='3071804203640664359'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/cpython-on-mobile-platforms.html'>CPython on Mobile platforms - Python Language Summit 2020</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-3071804203640664359' itemprop='description articleBody'> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXo114_hvreDvjw-I9grLq8Hy69mgvunGq8YZbNOVZ0kmbC5Jg3A_Xhjc317AQdfV2dtF6ie13PQNQ1TCYI8qewOWwBKYe0AVYeUJDTTlF-RdfJmnFrkazBDEdsc3ZMA-KJw/s1600/rusty-mugshot-djangocon-us-2018.jpg" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXo114_hvreDvjw-I9grLq8Hy69mgvunGq8YZbNOVZ0kmbC5Jg3A_Xhjc317AQdfV2dtF6ie13PQNQ1TCYI8qewOWwBKYe0AVYeUJDTTlF-RdfJmnFrkazBDEdsc3ZMA-KJw/s1600/rusty-mugshot-djangocon-us-2018.jpg" /></a><br /> "We've got very big news on Android," Russell Keith-Magee told the Language Summit. "We're close to having a full set of BeeWare tools that can run on Android."<br /> <br /> The BeeWare project aims to let programmers write apps in Python for Android, iOS, and other platforms using native UI widgets. Keith-Magee reported that BeeWare has made good progress since <a href="https://pyfound.blogspot.com/2019/05/russell-keith-magee-python-on-other.html">his Summit presentation</a> last year. On iOS, "Python worked well before, it works well now," and BeeWare has added Python 3.8 support. Until recently, however, Python was struggling to make inroads on Android. BeeWare's Android strategy was to compile Python to Java bytecode, but Android devices are now fast enough, and the Android kernel permissive enough, to run CPython itself. <a href="https://beeware.org/news/buzz/beeware-project-awarded-a-psf-education-grant/">With funding from the PSF</a>, BeeWare hired Asheesh Laroia to port CPython to Android.<br /> <br /> <a href="http://pyfound.blogspot.com/2020/04/the-2020-python-language-summit.html">Read more 2020 Python Language Summit coverage</a>.<br /> <hr />A top concern for BeeWare is distribution size. Python applications for mobile each bundle their own copy of the Python runtime, so Python must be shrunk as small as possible. There have been proposals recently for a "minimum viable Python" or "<a href="https://glyph.twistedmatrix.com/2019/06/kernel-python.html">kernel Python</a>", which would ship without the standard library and let developers install the stdlib modules they need from PyPI. (<a href="http://pyfound.blogspot.com/2019/05/amber-brown-batteries-included-but.html">Amber Brown's 2019 Summit talk</a> inspired some of these proposals.) Keith-Magee said a kernel Python would solve many problems for mobile. He also asked for a cross-compiling <code>pip</code> that installs packages for a target platform, instead of the platform it's running on. Senthil Kumaran observed, "BeeWare, MicroPython, Embedded Python, Kivy all seem to have a need for a kernel-only Python," and suggested they combine forces to create one.<br /> <br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZTv04D6S8fxLoF_R9LK7e0WFGwz_DMKcfm-dvEQerQNkpibMXyLfGS7wXzg3ZzMik6iXWtj9HyMp9cDEPHK9WxGz0pOqbuVAp7U9U4TI5cfFBzAJiNoi3cADCHbO2ReUw2w/s1600/beeware.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZTv04D6S8fxLoF_R9LK7e0WFGwz_DMKcfm-dvEQerQNkpibMXyLfGS7wXzg3ZzMik6iXWtj9HyMp9cDEPHK9WxGz0pOqbuVAp7U9U4TI5cfFBzAJiNoi3cADCHbO2ReUw2w/s1600/beeware.png" /></a><br /> <br /> To regular Python programmers, the mobile environment is an alien planet. There are no subprocesses; sockets, pipes and signals all behave differently than on regular Unix; and many syscalls are prohibited. TLS certificate handling on Android is particularly quirky. For the CPython test suite to pass on mobile it must skip the numerous tests that use <code>fork</code> or <code>spawn</code>, or use signals, or any other APIs that are different or absent.<br /> <br /> Adapting CPython for life on this alien planet requires changes throughout the code base. In 2015 Keith-Magee submitted a "monster patch" <a href="https://bugs.python.org/issue23670">enabling iOS support for CPython</a>, but the patch has languished in the years since. Now, he <a href="https://github.com/freakboy3742/cpython">maintains a fork</a> with the iOS patches applied to branches for Python 3.5 through 3.8. For Android, he maintains a handful of patch files and a list of unittests to skip. Now that Android support is maturing, he said, "We're in a place where we can have a serious conversation about how we get these changes merged into CPython itself."<br /> <br /> A prerequisite for merging these changes is mobile platform testing in <a href="https://www.python.org/dev/buildbot/">CPython's continuous integration system</a>. Currently, Keith-Magee tests on his laptop with several phones connected to it. As he told the Summit, he's certain there is a CI service with physical phones, but he has not found it yet and hasn't invested in building one. He develops BeeWare in his spare time, and CI is not the top priority. "Funding is one thing that makes stuff happen," he said. He thanked the PSF for the grant that made Android support possible. Mobile Python suffers a chicken-and-egg problem: there is no corporate funding for Python on mobile because Python doesn't support mobile, so there is no one relying on mobile Python who is motivated to fund it.<br /> <br /> Keith-Magee asked the Summit attendees to be frank with him about bringing mobile Python into the core. He asked, "Do we want this at all?" If so, the core team would have to review <em>all</em> patches with their mobile impact in mind, as well as reviewing mobile-specific patches. "What is the appetite for patches that require non-mobile developers to care about mobile issues?" The decision would involve the whole core team and many community discussions. Guido van Rossum endorsed good mobile support long-term. So did Ned Deily, adding, "To actually do it will require money and people. Bigger than many other projects." <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08612435176546178055' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08612435176546178055' rel='author' title='author profile'> <span itemprop='name'>A. Jesse Jiryu Davis</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/cpython-on-mobile-platforms.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/cpython-on-mobile-platforms.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-10T15:23:00-04:00'>5/10/2020 03:23:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-947433767'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=3071804203640664359&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Thursday, May 07, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcuM2j2xsM-FWT81fCMoDu43PV9FZak01JYveD9qE912_5YKq0y6UYe7hl5AhnuYcrOi50-xKtaJ_ztXjVYEehJvbAtFF1eVWuUxp0bWjamES6kk0K8wcRrj5y5jydU0VN9Q/s320/wijaya.jpg' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='5393641590632381996' itemprop='postId'/> <a name='5393641590632381996'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/core-workflow-updates-python-language.html'>Core Workflow updates - Python Language Summit 2020</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-5393641590632381996' itemprop='description articleBody'> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcuM2j2xsM-FWT81fCMoDu43PV9FZak01JYveD9qE912_5YKq0y6UYe7hl5AhnuYcrOi50-xKtaJ_ztXjVYEehJvbAtFF1eVWuUxp0bWjamES6kk0K8wcRrj5y5jydU0VN9Q/s1600/wijaya.jpg" imageanchor="1"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcuM2j2xsM-FWT81fCMoDu43PV9FZak01JYveD9qE912_5YKq0y6UYe7hl5AhnuYcrOi50-xKtaJ_ztXjVYEehJvbAtFF1eVWuUxp0bWjamES6kk0K8wcRrj5y5jydU0VN9Q/s320/wijaya.jpg" width="320" /></a><br /> <br /> The PyCon 2015 sprint was the first time this blogger contributed to Python—or rather, I tried to. The three patches I submitted that year are awaiting a review to this day. In recent years, however, the core team has made bold changes to their development workflow to make their tasks easier, to spread responsibility more widely, and to improve the experience of contributors. When I submitted a patch in the 2018 sprints it was reviewed and merged in a few weeks. Mariatta Wijaya has led many of these changes. She presented the latest updates to the core workflow.<br /> <br /> <a href="http://pyfound.blogspot.com/2020/04/the-2020-python-language-summit.html">Read more 2020 Python Language Summit coverage</a>.<br /> <hr />"This is the third Language Summit in which I've talked about GitHub issues," sighed Wijaya. <a href="https://pyfound.blogspot.com/2019/05/mariatta-wijaya-lets-use-github-issues.html">Last year she urged</a> the core team to make a decision about replacing the quirky old bug tracker on bugs.python.org. Two weeks later they approved <a href="https://www.python.org/dev/peps/pep-0581/">PEP 581: Using GitHub Issues</a>. Its sequel, <a href="https://www.python.org/dev/peps/pep-0588/">PEP 588: GitHub Issues Migration plan</a>, is still in progress. "I really care about this topic," said Wijaya, but she and her collaborators have mostly focused on other projects for the last year.<br /> <br /> There are signs of progress, however. Wijaya began a wish list where Python developers can request <a href="https://github.com/python/core-workflow/issues/359">features for GitHub's issue tracker</a> that will make it a full replacement for bugs.python.org. <a href="http://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html">The PSF is seeking to hire a project manager</a> for the migration. Wijaya, Brett Cannon, and others have met with GitHub staff, who have offered to import old issues in bulk. The migration will be "like throwing a big switch," said Cannon; there must be a great deal of planning behind the scenes before it is thrown.<br /> <br /> In 2018, the Python developers created <a href="https://discuss.python.org/">a web forum</a> (running on <a href="https://discourse.org/">Discourse</a>) as a potential replacement for their several mailing lists. Since then, they have contended with <em>both</em> mailing lists and the web forum. Wijaya asked, "We've been using Discourse for a couple of years, is it time to make some final decisions?" Guido van Rossum said that using Discourse via email is clunky, but if he silenced its emails he would forget to check it on the web. Brett Cannon hypothesized that people who have tuned their personal systems for managing email prefer to use only email, and those who have not, prefer Discourse. The Summit attendees reached no conclusion.<br /> <br /> A new team of Python contributors formed last summer: <a href="https://devguide.python.org/triaging/#python-triage-team">the Python Triage Team</a>. Triagers can close issues, edit issue labels, etc., and they can label or close pull requests in the Python organization's GitHub repositories. Unlike core developers, they cannot merge pull requests. Their power to manage issues extends to all the core developers' repositories, including CPython, the developer guide, and the source code for Python's GitHub bots. New members join the team <a href="https://devguide.python.org/triaging/#becoming-a-member-of-the-python-triage-team">when they are invited by core developers</a>; they can self-nominate by asking a core dev to vouch for them. Wijaya said several triagers have graduated to the core team, and she wants this pipeline to keep flowing. New core developer Kyle Stanley recommended better promotion of the triager-to-core-dev career path. "For myself and several recent candidates, it seems to have worked excellently as a stepping stone." <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08612435176546178055' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08612435176546178055' rel='author' title='author profile'> <span itemprop='name'>A. Jesse Jiryu Davis</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/core-workflow-updates-python-language.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/core-workflow-updates-python-language.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-07T13:37:00-04:00'>5/07/2020 01:37:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-947433767'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=5393641590632381996&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Tuesday, May 05, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='8520' itemprop='blogId'/> <meta content='2516092096854063107' itemprop='postId'/> <a name='2516092096854063107'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/python-developers-survey-2019-results.html'>Python Developers Survey 2019 Results</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-2516092096854063107' itemprop='description articleBody'> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; text-size-adjust: auto;"> We are excited to share the results of the third official Python Developers Survey conducted by the Python Software Foundation with the help of JetBrains.</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> More than 24,000 Python users from over 150 countries took part in the survey this past November. With the help of the data collected, we are able to present the summarized results, identify the latest trends, and create a Python developer profile.</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <a href="https://www.jetbrains.com/lp/python-developers-survey-2019/" style="-webkit-print-color-adjust: exact; color: #4183c4;">View the results of Python Developers Survey 2019!</a></div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> The survey results cover a broad list of topics. Some of the key things you may learn from the report include: main motivations for Python usage, current popular frameworks, libraries, tools and languages, and many other insights.</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> In all likelihood, there are plenty of potential findings that were not included in the report. If you have specific questions that are unanswered,<span class="Apple-converted-space"> </span><a href="sendto:surveys@python.org" style="-webkit-print-color-adjust: exact; color: #4183c4;">send them to us</a><span class="Apple-converted-space"> </span>and we’ll dig into the data for additional analysis. You also have the opportunity to delve deeper into the<span class="Apple-converted-space"> </span><a href="https://drive.google.com/drive/folders/1GW86M_QLFOA2KyeWeb8hzBj_RqQIXmAU" style="-webkit-print-color-adjust: exact; color: #4183c4;">raw survey data</a><span class="Apple-converted-space"> </span>and uncover your own amazing facts.</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> We’ll be delighted to learn about your findings! Please share them on Twitter or other social media, mentioning<span class="Apple-converted-space"> </span><a href="https://twitter.com/jetbrains" style="-webkit-print-color-adjust: exact; color: #4183c4;">@jetbrains</a>‏ and<span class="Apple-converted-space"> </span><a href="https://twitter.com/thepsf" style="-webkit-print-color-adjust: exact; color: #4183c4;">@ThePSF</a><span class="Apple-converted-space"> </span>with the #pythondevsurvey hashtag. We’re also very open to any suggestions and feedback related to this survey which could help us run an even better one next time. Feel free to open issues<span class="Apple-converted-space"> </span><a href="https://github.com/python/python-dev-survey/issues" style="-webkit-print-color-adjust: exact; color: #4183c4;">here</a><span class="Apple-converted-space"> </span>with any comments or questions.</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-top: 15px; text-size-adjust: auto;"> Many thanks to everyone who participated in the survey and helped us map an accurate landscape of the Python community!</div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/18334325508115717169' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/18334325508115717169' rel='author' title='author profile'> <span itemprop='name'>Ewa Jodlowska</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/python-developers-survey-2019-results.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/python-developers-survey-2019-results.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-05T11:00:00-04:00'>5/05/2020 11:00:00 AM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-771879458'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=2516092096854063107&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Monday, May 04, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='8520' itemprop='blogId'/> <meta content='6320736467300782731' itemprop='postId'/> <a name='6320736467300782731'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html'>Python’s migration to GitHub - Request for Project Manager Resumes</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-6320736467300782731' itemprop='description articleBody'> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> The Python Software Foundation is looking for a Project Manager to assist with CPython’s migration from bugs.python.org to GitHub for issue tracking. CPython's development partially moved to GitHub in February 2017. All other projects within the PSF's organization are hosted on GitHub and are using GitHub issues. CPython is still using Roundup as the issue tracker on<span class="Apple-converted-space"> </span><a href="https://bugs.python.org/" style="-webkit-print-color-adjust: exact; color: #4183c4;">https://bugs.python.org</a><span class="Apple-converted-space"> </span>(also known as “bpo”). To read more about the rationale behind this migration, read<span class="Apple-converted-space"> </span><a href="https://www.python.org/dev/peps/pep-0581/" style="-webkit-print-color-adjust: exact; color: #4183c4;">PEP 581</a>.</div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> Thank you to GitHub for donating financial support so this project can begin.</div> <h2 id="toc_1" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-family: Helvetica, arial, sans-serif; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> Timeline</h2> <ul style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin: 15px 0px; padding-left: 30px; text-size-adjust: auto;"> <li style="-webkit-print-color-adjust: exact; margin: 0px;">May 4 - Requests for resumes opens</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">June 4 - Requests for resumes closes</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">June 12 - Final decision will be made on proposals received</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">June 22 - Work will begin</li> </ul> <h2 id="toc_2" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-family: Helvetica, arial, sans-serif; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> Submitting a proposal</h2> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> Resumes should be submitted as Portable Document Format (PDF) files via email to <a href="mailto:ewa.jodlowska@pyfound.org" target="_blank">Ewa Jodlowska</a>.<br /> <span style="font-size: 24px;"><br /></span> <br /> <h2 id="toc_3" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-family: Helvetica, arial, sans-serif; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> Role description</h2> </div> <h3 id="toc_4" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); cursor: text; font-family: Helvetica, arial, sans-serif; font-size: 18px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> Goal</h3> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> Support Python through the full transition from bugs.python.org to GitHub with the assistance of GitHub’s migration team.</div> <h3 id="toc_5" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); cursor: text; font-family: Helvetica, arial, sans-serif; font-size: 18px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> Tasks</h3> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> These tasks are from<span class="Apple-converted-space"> </span><a href="https://www.python.org/dev/peps/pep-0588/" style="-webkit-print-color-adjust: exact; color: #4183c4;">PEP 588</a><span class="Apple-converted-space"> </span>and a meeting the Steering Council had with GitHub. This is not an exhaustive list of all tasks, but an overview of what the work will most likely entail.<span class="Apple-converted-space"> The migration will be completed by GitHub and the Project Manager will work with the Python team to steer that migration. </span></div> <ul style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin: 15px 0px; padding-left: 30px; text-size-adjust: auto;"> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Create a timeline for the project with the Python team and GitHub team</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Find out from the community the context behind GitHub search limitations, why bugs.python.org search is sometimes preferred.</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Research the Contributor License Agreement (CLA) process and how it can be achieved outside of bugs.python.org. Work with interested contractors, volunteers, and the PSF’s Director of Infrastructure on a solution.</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Work with GitHub’s migration team and Python’s community on how mapping of fields should work from bugs.python.org to GitHub</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Work with GitHub’s migration team on the transition from bugs.python.org and be the Python point of contact for GitHub. This includes helping field questions from GitHub to the Steering Council/core devs and vice versa.</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Assist the Python community with creating guidelines on how people are promoted to Python’s triage team.</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Obtain from GitHub a list of projects that have bots built that may help Python with "nosy lists"</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Oversee the creation of the new workflow on GitHub</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Assist with the creation of GitHub labels and templates when necessary<span class="Apple-converted-space"> </span></li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Oversee the creation of the sandbox issue tracker on GitHub to experiment and test the new workflow</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Ensure that the sandbox received adequate testing from the Python team</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Update the devguide with that new process ahead of the migration and communicate it to the core developers</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Communicate with PSF staff on a regular basis when necessary and provide monthly reports via email.</li> </ul> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> Note: Some of the work (for example the CLA process) may require additional hired help from outside contractors. Decisions on these tasks will be made after the Project Manager’s research and review is presented to the PSF staff and Steering Council.</div> <h2 id="toc_6" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-family: Helvetica, arial, sans-serif; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> Estimated budget</h2> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> The budget is capped at $30,000 for this project.</div> <h2 id="toc_7" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-family: Helvetica, arial, sans-serif; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> Necessary Skills</h2> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <ul style="-webkit-print-color-adjust: exact; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; margin: 15px 0px; padding-left: 30px; text-size-adjust: auto;"> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Excellent time management skills</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Must be very organized, punctual, and detail-oriented</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Experience working with volunteers<span class="Apple-converted-space"> </span></li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Excellent written and verbal communication</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Experience working with software development teams (remotely is a plus)</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Ability to balance demand and prioritize</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Experience working with GitHub </li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Experience with GitHub APIs is a plus</li> <li style="-webkit-print-color-adjust: exact; margin: 0px;">Experience working with Roundup is a plus</li> </ul> <h2 id="toc_8" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-family: Helvetica, arial, sans-serif; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> Questions?</h2> <div style="-webkit-print-color-adjust: exact; caret-color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; margin-top: 15px; text-size-adjust: auto;"> Contact <a href="mailto:ewa.jodlowska@pyfound.org" target="_blank">Ewa Jodlowska</a>, PSF’s Executive Director..</div> </div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/18334325508115717169' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/18334325508115717169' rel='author' title='author profile'> <span itemprop='name'>Ewa Jodlowska</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-04T15:51:00-04:00'>5/04/2020 03:51:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-771879458'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=6320736467300782731&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Sunday, May 03, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz1wZMuiffXv0PrZJk0HaDgWpwrclKHpV-9viDxYq6bqi_PZxPNgsX_Rdpx4R9q_A5HhuIKe83qGpJNd-i4cZTSPs87E2dGGSDZbIrmRQ4K1SJq3EMQVYUEDM2mzO7yOyT9A/s320/zac-profile.jpg' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='2219845905670747860' itemprop='postId'/> <a name='2219845905670747860'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/05/property-based-testing-for-python.html'>Property-Based Testing for Python builtins and the standard library - Python Language Summit 2020</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-2219845905670747860' itemprop='description articleBody'> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz1wZMuiffXv0PrZJk0HaDgWpwrclKHpV-9viDxYq6bqi_PZxPNgsX_Rdpx4R9q_A5HhuIKe83qGpJNd-i4cZTSPs87E2dGGSDZbIrmRQ4K1SJq3EMQVYUEDM2mzO7yOyT9A/s1600/zac-profile.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz1wZMuiffXv0PrZJk0HaDgWpwrclKHpV-9viDxYq6bqi_PZxPNgsX_Rdpx4R9q_A5HhuIKe83qGpJNd-i4cZTSPs87E2dGGSDZbIrmRQ4K1SJq3EMQVYUEDM2mzO7yOyT9A/s320/zac-profile.jpg" width="320" /></a></div> <br /> Zac Hatfield-Dodds opened his presentation with a paraphrase of the economist Thomas Schelling:<br /> <blockquote class="tr_bq"> <em>No matter how rigorous her analysis or heroic his imagination, no person can write a test case that would never occur to them.</em></blockquote> Hatfield-Dodds told the Language Summit, handwritten tests are "fantastic for testing particular edge cases, they're great regression tests," but they're limited by the developer's understanding of the system under test. "We can't write tests for bugs we don't know could occur." We can overcome this limit with <em>exhaustive testing</em>, checking our code's behavior with every possible input; if that is impractical, <em>coverage-guided fuzz testing</em> can generate random inputs and evolve them, trying to explore every branch in the code under test. Fuzzers are very good at finding inputs that crash a program, but they're not as well suited for finding other kinds of bugs.<br /> <br /> <a href="https://pyfound.blogspot.com/2020/04/the-2020-python-language-summit.html">Read more 2020 Python Language Summit coverage</a>.<br /> <hr /> For testing the Python standard library, Hatfield-Dodds proposed a different technique: <em>property-based testing</em>. (He is one of the leaders of the <a href="https://hypothesis.readthedocs.io/">Hypothesis property-based testing project</a>.) A property-based test framework doesn't generate totally random input like a fuzzer; it can generate structured inputs such as lists of numbers, or only sorted lists, or instances of a certain object. Unlike handwritten tests, which usually assert that a particular input produces one exact output, property-based tests assert <em>properties</em> of a function, for example that its output is sorted, or that a function is idempotent or commutative.<br /> <br /> Hatfield-Dodds presented the following Hypothesis test of a JSON codec:<br /> <pre class="prettyprint">@given( value=st.recursive( st.none() | st.booleans() | st.floats() | st.text(), lambda x: st.lists(x) | st.dictionaries(st.text(), x), ) ) def test_record_json_roundtrip(value): assume(value == value) assert value == json.loads(json.dumps(value)) </pre> The <code>recursive</code> input generator can create None, booleans, floats, text, or lists or dictionaries that contain such values, and so on recursively. Within the test function, the <code>assume</code> statement checks that the input is equal to itself, to avoid inputs with <code>nan</code>, which is not. The heart of the test is the <code>assert</code> statement.<br /> <br /> (The above example still has troubles with <code>nan</code>, <a href="https://zhd.dev/sufficiently/">see Hatfield-Dodds' PyCon Australia talk</a>.)<br /> <br /> Hypothesis searches for bugs by randomizing the input, or trying interesting values that tend to trigger edge cases, or retrying inputs that triggered bugs in previous runs. When Hypothesis finds a bug, it evolves the input, searching for the simplest input that reproduces the same bug.<br /> <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWbRREUd0vEfKsosDGMv9UTTkS9Vouaj-6PIEPK1mMxuwtyUBCqtbVrUO0l-C5rhCbr8ZceVKPmugJGf1Z1rayoBnkz1jNg81u2EgyEm4wMaQhnVxeVvJ6gk70t3Za4zvZsA/s1600/hypothesis-minimization.png" /><br /> "I want you all to write property-based tests for CPython, for builtins, for PyPy, for everything," said Hatfield-Dodds. He proposed to write new tests, or port existing ones to a property-based test framework, run them in CPython's continuous integration suite, and share them among the Python implementations. These tests could use Hypothesis; they could also be integrated with the <a href="https://github.com/google/AFL">AFL fuzzer</a> or used in <a href="https://github.com/google/oss-fuzz">Google's OSS-Fuzz</a> project. He presented a <a href="https://github.com/Zac-HD/stdlib-property-tests">repository of tests</a> demonstrating the technique for standard library modules such as <code>gzip</code>, <code>re</code>, and <code>datetime</code>. There is even <a href="https://github.com/Zac-HD/stdlib-property-tests/blob/master/tests/test_source_code.py">a test that can generate random, valid Python code</a> to fuzz-test the Python parser.<br /> <br /> 艁ukasz Langa mentioned that <a href="https://www.drmaciver.com/2015/03/27-bugs-in-24-hours/">David MacIver had used Hypothesis to test a Python code formatter</a> and found dozens of bugs.<br /> <br /> Paul Ganssle told the Summit that he used property-based testing for his implementation of <a href="https://docs.python.org/3/library/datetime.html#datetime.date.fromisoformat">datetime.fromisoformat</a>. When the function was merged into the standard library the property-based tests were not. In subsequent development Ganssle introduced a segfault bug that "almost certainly would have been caught" if the original tests had still been running. He strongly endorsed Hatfield-Dodds's idea. He added that property-based testing is especially good at checking that two implementations of a module, one written in Python and one in C, are equivalent. <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08612435176546178055' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08612435176546178055' rel='author' title='author profile'> <span itemprop='name'>A. Jesse Jiryu Davis</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/05/property-based-testing-for-python.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/05/property-based-testing-for-python.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-03T18:47:00-04:00'>5/03/2020 06:47:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-947433767'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=2219845905670747860&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Friday, May 01, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikEBxyX3QjlRyq5sdnwlB_y-7ZFKYAYk8LmEI7kDgHTAZ_mebLKrRFb4_4X7ZF3lMy7x9NBkVhNbVHs_1XE7KieU4kUVlxzj968yzr5xytlsGEq9uG0R6blu5jwellmv1ZAw/s320/eric-smith.jpg' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='8902892128759350046' itemprop='postId'/> <a name='8902892128759350046'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/04/all-strings-become-f-strings-python.html'>Should All Strings Become f-strings? - Python Language Summit 2020</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-8902892128759350046' itemprop='description articleBody'> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikEBxyX3QjlRyq5sdnwlB_y-7ZFKYAYk8LmEI7kDgHTAZ_mebLKrRFb4_4X7ZF3lMy7x9NBkVhNbVHs_1XE7KieU4kUVlxzj968yzr5xytlsGEq9uG0R6blu5jwellmv1ZAw/s1600/eric-smith.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1544" data-original-width="1158" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikEBxyX3QjlRyq5sdnwlB_y-7ZFKYAYk8LmEI7kDgHTAZ_mebLKrRFb4_4X7ZF3lMy7x9NBkVhNbVHs_1XE7KieU4kUVlxzj968yzr5xytlsGEq9uG0R6blu5jwellmv1ZAw/s320/eric-smith.jpg" width="239" /></a></div> <br /> The first language change proposed this year was the most radical: to make f-strings the default. Eric V. Smith, who wrote <a href="https://www.python.org/dev/peps/pep-0498/">the PEP for f-strings</a> in 2015, said they are the killer feature of Python 3.6, and they are the motivation for many of his clients to move to Python 3. However, they are error-prone. It's common to forget the "f" prefix:<br /> <pre class="prettyprint">x = 1 # Forgot the f prefix. print("The value is {x}")</pre> Smith has observed programmers f-prefixing all strings, whether they include substitutions or not, just to avoid this mistake.<br /> <br /> <a href="https://pyfound.blogspot.com/2020/04/the-2020-python-language-summit.html">Read more 2020 Python Language Summit coverage.</a><br /> <br /> <hr /> When f-strings were added in 3.6, it was suggested to make them the default, but this was too big a breaking change. Besides, replacing all literal brace characters with double braces would be ugly:<br /> <pre class="prettyprint">"A single pair of braces: {{}}"</pre> In this year's Summit, Smith proposed again to make f-strings the default. The following kinds of strings would become f-strings:<br /> <ul> <li><code> "string"</code> — an f-string<br /> </li> <li><code>f"string"</code> — still an f-string<br /> </li> <li><code>r"string"</code> — a raw f-string<br /> </li> </ul> Binary literals like b"string" would not become f-strings. Smith would add a new "p" string prefix for plain strings, which would behave like ordinary strings today.<br /> <ul> <li><code>p"string"</code> — a plain string<br /> </li> </ul> Performance would not be affected: the runtime behavior of a string without any substitutions would be the same as today. Plain strings would still have some uses; for example, regular expressions that include braces, or as the input to <code>str.format</code>. In Smith's opinion, f-strings have superseded <code>str.format</code>, but several in the audience objected that <code>str.format</code> with a plain string allows for late binding, and f-strings don't obviate <code>str.format_map</code>.<br /> <br /> Smith acknowledged some problems with his idea. It would introduce yet another string prefix. Flipping the master switch to enable f-mode would break some code, so there must be a way to gradually enable the change module by module, perhaps like:<br /> <pre class="prettyprint">from __future__ import all_fstrings </pre> He was concerned the change was so drastic that the Python core developers would never have the nerve to enable it without requiring a <code>future</code> import. If so, the idea should be abandoned right away.<br /> <br /> Yarko Tymciurak asked via chat: "How do you describe to beginners what p'why is this needed' is?" Smith conceded that p-strings make the language more complicated, but, he said, "There's going to be very few p's in the wild, and I think their explanation will be fairly obvious."<br /> <br /> Several attendees were enthusiastic to make the change. Brett Cannon said that removing the need for f-prefix would make the language easier for beginners.<br /> <br /> Larry Hastings pointed out that PHP strings are format strings by default and "the script kids love it." However, he wrote, "It seems to me this is solving the problem of 'oh I forgot to put an f in front of my string', and not noticing until it's too late. Is that problem bad enough that we have to change the language?
" Many agreed that f-strings by default would have been a good idea if Python were beginning from scratch; however, Paul Moore, Guido van Rossum, and others feared the disruption would outweigh the benefits.<em> </em>The group concluded that Smith should send his PEP to the mailing list for further debate. <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08612435176546178055' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08612435176546178055' rel='author' title='author profile'> <span itemprop='name'>A. Jesse Jiryu Davis</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/04/all-strings-become-f-strings-python.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/04/all-strings-become-f-strings-python.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-05-01T18:07:00-04:00'>5/01/2020 06:07:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-947433767'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=8902892128759350046&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> </div> <div class='blog-pager' id='blog-pager'> <span id='blog-pager-newer-link'> <a class='blog-pager-newer-link' href='https://pyfound.blogspot.com/search?updated-max=2020-07-01T18:21:00-04:00&max-results=2&reverse-paginate=true' id='Blog1_blog-pager-newer-link' title='Newer Posts'>Newer Posts</a> </span> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='https://pyfound.blogspot.com/search?updated-max=2020-05-01T18:07:00-04:00&max-results=2' id='Blog1_blog-pager-older-link' title='Older Posts'>Older Posts</a> </span> <a class='home-link' href='https://pyfound.blogspot.com/'>Home</a> </div> <div class='clear'></div> <div class='blog-feeds'> <div class='feed-links'> Subscribe to: <a class='feed-link' href='https://pyfound.blogspot.com/feeds/posts/default' target='_blank' type='application/atom+xml'>Posts (Atom)</a> </div> </div> </div></div> </div> </div> <div class='column-left-outer'> <div class='column-left-inner'> <aside> </aside> </div> </div> <div class='column-right-outer'> <div class='column-right-inner'> <aside> <div class='sidebar section' id='sidebar-right-1'><div class='widget Text' data-version='1' id='Text1'> <h2 class='title'>Mission</h2> <div class='widget-content'> <span style="font-size: 125%;font-size:125%;"><i>The mission of the <a href="https://www.python.org/psf/">Python Software Foundation</a> is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers.</i></span> </div> <div class='clear'></div> </div><div class='widget LinkList' data-version='1' id='LinkList1'> <div class='widget-content'> <ul> <li><a href='https://www.python.org/psf-landing/'>Python Software Foundation</a></li> <li><a href='https://www.python.org/psf/grants/'>Grants Program</a></li> <li><a href='https://www.python.org/psf/membership/'>Membership</a></li> <li><a href='https://www.python.org/community/awards/'>Awards</a></li> <li><a href='https://www.python.org/psf/records/board/minutes/'>Meeting Minutes</a></li> </ul> <div class='clear'></div> </div> </div><div class='widget Image' data-version='1' id='Image1'> <h2>PSF Sponsors</h2> <div class='widget-content'> <a href='https://www.python.org/psf/sponsors/'> <img alt='PSF Sponsors' height='143' id='Image1_img' src='https://blogger.googleusercontent.com/img/a/AVvXsEiagchpTRkriKoEe2Cqh2Bd5mX7Un4EYG-fq2Gdwx-Jx5scs09-0bmLVT89ewlhrQsiaJVE6nUU1Z0UkZFu0KUM2f82CiXXGsY_mg0JRq8iUtt_Rob_rcWX9meUjM2ql0XMoYFwO7dtt8T3cHO5oGfxo3HPk-9Lz358AlCHMDRAo5fgBXTuEuo=s302' width='302'/> </a> <br/> <span class='caption'>A big thank you to the above PSF sponsors for supporting our mission!</span> </div> <div class='clear'></div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <h2>Blog Archive</h2> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2025/'> 2025 </a> <span class='post-count' dir='ltr'>(6)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2025/03/'> March </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2025/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2025/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/'> 2024 </a> <span class='post-count' dir='ltr'>(58)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/12/'> December </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/11/'> November </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/07/'> July </a> <span class='post-count' dir='ltr'>(7)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/06/'> June </a> <span class='post-count' dir='ltr'>(16)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/05/'> May </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/01/'> January </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/'> 2023 </a> <span class='post-count' dir='ltr'>(37)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/08/'> August </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/06/'> June </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/05/'> May </a> <span class='post-count' dir='ltr'>(12)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/'> 2022 </a> <span class='post-count' dir='ltr'>(35)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/06/'> June </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/05/'> May </a> <span class='post-count' dir='ltr'>(12)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/03/'> March </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/'> 2021 </a> <span class='post-count' dir='ltr'>(42)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/11/'> November </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/07/'> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/06/'> June </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/05/'> May </a> <span class='post-count' dir='ltr'>(12)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/04/'> April </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/02/'> February </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> ▼  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/'> 2020 </a> <span class='post-count' dir='ltr'>(51)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/12/'> December </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/09/'> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/07/'> July </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/06/'> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> ▼  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/05/'> May </a> <span class='post-count' dir='ltr'>(10)</span> <ul class='posts'> <li><a href='https://pyfound.blogspot.com/2020/05/lightning-talks-part-2.html'>Lightning Talks Part 2 - Python Language Summit 2020</a></li> <li><a href='https://pyfound.blogspot.com/2020/05/call-for-volunteers-python-github.html'>Call for Volunteers! Python GitHub Migration Work ...</a></li> <li><a href='https://pyfound.blogspot.com/2020/05/6-ways-salesforce-gets-things-done-with.html'>6 Ways Salesforce Gets Things Done with Python</a></li> <li><a href='https://pyfound.blogspot.com/2020/05/capital-one-lessons-from-adopting.html'>Capital One - Lessons From Adopting Python as a Team</a></li> <li><a href='https://pyfound.blogspot.com/2020/05/cpython-on-mobile-platforms.html'>CPython on Mobile platforms - Python Language Summ...</a></li> <li><a href='https://pyfound.blogspot.com/2020/05/core-workflow-updates-python-language.html'>Core Workflow updates - Python Language Summit 2020</a></li> <li><a href='https://pyfound.blogspot.com/2020/05/python-developers-survey-2019-results.html'>Python Developers Survey 2019 Results</a></li> <li><a href='https://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html'>Python’s migration to GitHub - Request for Project...</a></li> <li><a href='https://pyfound.blogspot.com/2020/05/property-based-testing-for-python.html'>Property-Based Testing for Python builtins and the...</a></li> <li><a href='https://pyfound.blogspot.com/2020/04/all-strings-become-f-strings-python.html'>Should All Strings Become f-strings? - Python Lang...</a></li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/04/'> April </a> <span class='post-count' dir='ltr'>(11)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/03/'> March </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/'> 2019 </a> <span class='post-count' dir='ltr'>(45)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/09/'> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/08/'> August </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/06/'> June </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/05/'> May </a> <span class='post-count' dir='ltr'>(11)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/02/'> February </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/'> 2018 </a> <span class='post-count' dir='ltr'>(31)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/12/'> December </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/10/'> October </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/05/'> May </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/'> 2017 </a> <span class='post-count' dir='ltr'>(32)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/10/'> October </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/09/'> September </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/07/'> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/05/'> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/04/'> April </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/02/'> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/01/'> January </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/'> 2016 </a> <span class='post-count' dir='ltr'>(27)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/05/'> May </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/04/'> April </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/'> 2015 </a> <span class='post-count' dir='ltr'>(67)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/11/'> November </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/10/'> October </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/07/'> July </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/06/'> June </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/05/'> May </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/04/'> April </a> <span class='post-count' dir='ltr'>(13)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/03/'> March </a> <span class='post-count' dir='ltr'>(14)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/02/'> February </a> <span class='post-count' dir='ltr'>(9)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/01/'> January </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/'> 2014 </a> <span class='post-count' dir='ltr'>(14)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/'> 2013 </a> <span class='post-count' dir='ltr'>(18)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/06/'> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/03/'> March </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/'> 2012 </a> <span class='post-count' dir='ltr'>(21)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/06/'> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/05/'> May </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/'> 2011 </a> <span class='post-count' dir='ltr'>(55)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/10/'> October </a> <span class='post-count' dir='ltr'>(7)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/09/'> September </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/05/'> May </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/04/'> April </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/03/'> March </a> <span class='post-count' dir='ltr'>(13)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/02/'> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/'> 2010 </a> <span class='post-count' dir='ltr'>(35)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/12/'> December </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/07/'> July </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/06/'> June </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/05/'> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/04/'> April </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/'> 2009 </a> <span class='post-count' dir='ltr'>(21)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/09/'> September </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/07/'> July </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/06/'> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/05/'> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/'> 2008 </a> <span class='post-count' dir='ltr'>(23)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/08/'> August </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/05/'> May </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/03/'> March </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/02/'> February </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/'> 2007 </a> <span class='post-count' dir='ltr'>(26)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/10/'> October </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/06/'> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/'> 2006 </a> <span class='post-count' dir='ltr'>(39)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/11/'> November </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/10/'> October </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/09/'> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/05/'> May </a> <span class='post-count' dir='ltr'>(7)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/04/'> April </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/03/'> March </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> </div> </div> <div class='clear'></div> </div> </div></div> <table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'> <tbody> <tr> <td class='first columns-cell'> <div class='sidebar no-items section' id='sidebar-right-2-1'></div> </td> <td class='columns-cell'> <div class='sidebar no-items section' id='sidebar-right-2-2'></div> </td> </tr> </tbody> </table> <div class='sidebar no-items section' id='sidebar-right-3'></div> </aside> </div> </div> </div> <div style='clear: both'></div> <!-- columns --> </div> <!-- main --> </div> </div> <div class='main-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <footer> <div class='footer-outer'> <div class='footer-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left footer-fauxborder-left'> <div class='fauxborder-right footer-fauxborder-right'></div> <div class='region-inner footer-inner'> <div class='foot no-items section' id='footer-1'></div> <table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'> <tbody> <tr> <td class='first columns-cell'> <div class='foot no-items section' id='footer-2-1'></div> </td> <td class='columns-cell'> <div class='foot no-items section' id='footer-2-2'></div> </td> </tr> </tbody> </table> <!-- outside of the include in order to lock Attribution widget --> <div class='foot section' id='footer-3' name='Footer'><div class='widget Attribution' data-version='1' id='Attribution1'> <div class='widget-content' style='text-align: center;'> Powered by <a href='https://www.blogger.com' target='_blank'>Blogger</a>. </div> <div class='clear'></div> </div></div> </div> </div> <div class='footer-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </footer> <!-- content --> </div> </div> <div class='content-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <script type='text/javascript'> window.setTimeout(function() { document.body.className = document.body.className.replace('loading', ''); }, 10); </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/3551516202-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY6QQbFbSLVinBvTGYXzOEO6Djww3A:1744199393993';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d8520','//pyfound.blogspot.com/2020/05/','8520'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '8520', 'title': 'Python Software Foundation News', 'url': 'https://pyfound.blogspot.com/2020/05/', 'canonicalUrl': 'https://pyfound.blogspot.com/2020/05/', 'homepageUrl': 'https://pyfound.blogspot.com/', 'searchUrl': 'https://pyfound.blogspot.com/search', 'canonicalHomepageUrl': 'https://pyfound.blogspot.com/', 'blogspotFaviconUrl': 'https://pyfound.blogspot.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-55961911-3', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': false, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Python Software Foundation News - Atom\x22 href\x3d\x22https://pyfound.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Python Software Foundation News - RSS\x22 href\x3d\x22https://pyfound.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Python Software Foundation News - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/8520/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/7a8d7c47386f2f51', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'archive', 'pageName': '05/01/2020 - 06/01/2020', 'pageTitle': 'Python Software Foundation News: 05/01/2020 - 06/01/2020'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Python Software Foundation News', 'description': '\xa0\xa0News from the Python Software Foundation', 'url': 'https://pyfound.blogspot.com/2020/05/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': true, 'isLabelSearch': false, 'archive': {'year': 2020, 'month': 5, 'rangeMessage': 'Showing posts from May, 2020'}}}]); _WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', document.getElementById('Navbar1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/549359800-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/3681588378-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_TextView', new _WidgetInfo('Text1', 'sidebar-right-1', document.getElementById('Text1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList1', 'sidebar-right-1', document.getElementById('LinkList1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_ImageView', new _WidgetInfo('Image1', 'sidebar-right-1', document.getElementById('Image1'), {'resize': true}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar-right-1', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_AttributionView', new _WidgetInfo('Attribution1', 'footer-3', document.getElementById('Attribution1'), {}, 'displayModeFull')); </script> </body> </html>