<?xml version="1.0"?>
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns="http://purl.org/rss/1.0/"
>
<channel rdf:about="http://planetpython.org/">
	<title>Planet Python</title>
	<link>http://planetpython.org/</link>
	<description>Planet Python - http://planetpython.org/</description>

	<items>
		<rdf:Seq>
		
			<rdf:li rdf:resource="https://realpython.com/python-dicts/" />
		
			<rdf:li rdf:resource="https://realpython.com/quizzes/factory-method-pattern/" />
		
			<rdf:li rdf:resource="https://lucumr.pocoo.org/2026/4/8/mario-and-earendil/" />
		
			<rdf:li rdf:resource="https://pycoders.com/issues/729" />
		
			<rdf:li rdf:resource="https://devblogs.microsoft.com/python/?p=10280" />
		
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-11638628.post-6696935363290505742" />
		
			<rdf:li rdf:resource="https://www.djangoproject.com/weblog/2026/apr/07/security-releases/" />
		
			<rdf:li rdf:resource="https://realpython.com/courses/using-loguru-to-simplify-python-logging/" />
		
			<rdf:li rdf:resource="https://www.djangoproject.com/weblog/2026/apr/07/could-you-host-djangocon-europe-2027-call-for-orga/" />
		
			<rdf:li rdf:resource="https://realpython.com/quizzes/building-gui-application-tkinter/" />
		
			<rdf:li rdf:resource="https://realpython.com/quizzes/using-loguru-to-simplify-python-logging/" />
		
			<rdf:li rdf:resource="https://blog.jetbrains.com/?post_type=pycharm&amp;p=697464" />
		
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-7958828565254404797.post-981046763342226471" />
		
			<rdf:li rdf:resource="https://wirtel.be/post/2026/04/07/livre-python-reconstruction/" />
		
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-11638628.post-3535936496780721923" />
		
			<rdf:li rdf:resource="https://treyhunner.com/2026/04/customizing-pdb-with-pdbrc" />
		
			<rdf:li rdf:resource="https://realpython.com/python-news-april-2026/" />
		
			<rdf:li rdf:resource="https://realpython.com/quizzes/for-loop-python/" />
		
			<rdf:li rdf:resource="d48e0bde-87c5-4c3a-8039-a14027f046a0" />
		
			<rdf:li rdf:resource="69bc7dc375cd6300017ec7bd" />
		
			<rdf:li rdf:resource="https://www.grulic.org.ar/~mdione/glob/posts/correcting-openstreetmap-wrong-tag-values/" />
		
			<rdf:li rdf:resource="https://lucumr.pocoo.org/2026/4/4/absurd-in-production/" />
		
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-11638628.post-5237672152583956497" />
		
			<rdf:li rdf:resource="https://realpython.com/quizzes/codex-cli/" />
		
			<rdf:li rdf:resource="https://realpython.com/quizzes/python-class-object/" />
		
		</rdf:Seq>
	</items>
</channel>


<item rdf:about="https://realpython.com/python-dicts/">
	<title>Real Python: Dictionaries in Python</title>
	<link>https://realpython.com/python-dicts/</link>
	
	<content:encoded><div><p>Python dictionaries are a powerful built-in data type that allows you to store key-value pairs for efficient data retrieval and manipulation. Learning about them is essential for developers who want to process data efficiently. In this tutorial, you’ll explore how to create dictionaries using literals and the <code>dict()</code> constructor, as well as how to use Python’s operators and built-in functions to manipulate them.</p>
<p>By learning about Python dictionaries, you’ll be able to access values through key lookups and modify dictionary content using various methods. This knowledge will help you in data processing, configuration management, and dealing with JSON and CSV data.</p>
<p><strong>By the end of this tutorial, you’ll understand that:</strong></p>
<ul>
<li>A dictionary in Python is a <strong>mutable collection of key-value pairs</strong> that allows for efficient data retrieval using unique keys.</li>
<li>Both <code>dict()</code> and <code>{}</code> can create dictionaries in Python. Use <code>{}</code> for <strong>concise syntax</strong> and <code>dict()</code> for <strong>dynamic creation</strong> from iterable objects.</li>
<li><code>dict()</code> is a <strong>class</strong> used to create dictionaries. However, it’s <strong>commonly called a built-in function</strong> in Python.</li>
<li><code>.__dict__</code> is a <strong>special attribute</strong> in Python that holds an object’s <strong>writable attributes</strong> in a dictionary.</li>
<li>Python <code>dict</code> is implemented as a <strong>hashmap</strong>, which allows for <strong>fast key lookups</strong>.</li>
</ul>
<p>To get the most out of this tutorial, you should be familiar with basic Python syntax and concepts such as <a href="https://realpython.com/python-variables/">variables</a>, <a href="https://realpython.com/python-for-loop/">loops</a>, and <a href="https://realpython.com/python-built-in-functions/">built-in functions</a>. Some experience with <a href="https://realpython.com/python-data-types/">basic Python data types</a> will also be helpful.</p>
<div class="alert alert-warning">
<p><strong>Get Your Code:</strong> <a class="alert-link" href="https://realpython.com/bonus/python-dicts-code/">Click here to download the free sample code</a> that you’ll use to learn about dictionaries in Python.</p>
</div>
<div class="container border rounded text-wrap-pretty my-3">

  <p class="my-3"><strong><span class="icon baseline"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span> Take the Quiz:</strong> Test your knowledge with our interactive “Dictionaries in Python” quiz. You’ll receive a score upon completion to help you track your learning progress:</p>

  <hr />

  <div class="row my-3">
    <div class="col-xs-12 col-sm-4 col-md-3 align-self-center">

      <a href="https://realpython.com/quizzes/dictionaries-in-python/" tabindex="-1">
        <div class="embed-responsive embed-responsive-16by9">

            <img alt="Dictionaries in Python" class="card-img-top m-0 p-0 embed-responsive-item rounded" height="1080" src="https://files.realpython.com/media/Dictionaries-in-Python_Watermarked.3656a2293c00.jpg" style="background: #e5c5ac;" width="1920" />


          <div class="card-img-overlay d-flex align-items-center">
            <div class="mx-auto">
              <span class="text-light"><span class="icon baseline scale2x"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></span>
            </div>
          </div>
        </div>
      </a>

    </div>
    <div class="col">
      <div class="mt-3 d-md-none"></div> 
      <p class="small text-muted mb-0"><strong>Interactive Quiz</strong></p>
      <a class="stretched-link" href="https://realpython.com/quizzes/dictionaries-in-python/"><span class="my-0 h4">Dictionaries in Python</span></a> 
      <p class="text-muted mb-0 small">Test your knowledge of Python's dict data type: how to create, access, and modify key-value pairs using built-in methods and operators.</p>
    </div>
  </div>

</div>

<h2 id="getting-started-with-python-dictionaries">Getting Started With Python Dictionaries<a class="headerlink" href="https://realpython.com/atom.xml#getting-started-with-python-dictionaries" title="Permanent link"></a></h2>
<p><strong>Dictionaries</strong> are one of Python’s most important and useful built-in data types. They provide a mutable collection of key-value pairs that lets you efficiently access and mutate values through their corresponding keys:</p>

  <div class="codeblock__header codeblock--blue">
    <span class="mr-2 noselect">Python</span>
    
    <div class="noselect">
      
        <span class="codeblock__output-toggle" tabindex="0" title="Toggle prompts and output"><span class="icon baseline js-codeblock-output-on codeblock__header--icon-lower"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></span>
      
    </div>
  </div>
  <div class="codeblock__contents">
    <div class="highlight highlight--with-header"><pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="n">config</span> <span class="o">=</span> <span class="p">{</span>
<span class="gp">... </span>    <span class="s2">"color"</span><span class="p">:</span> <span class="s2">"green"</span><span class="p">,</span>
<span class="gp">... </span>    <span class="s2">"width"</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
<span class="gp">... </span>    <span class="s2">"height"</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
<span class="gp">... </span>    <span class="s2">"font"</span><span class="p">:</span> <span class="s2">"Courier"</span><span class="p">,</span>
<span class="gp">... </span><span class="p">}</span>

<span class="gp">&gt;&gt;&gt; </span><span class="c1"># Access a value through its key</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s2">"color"</span><span class="p">]</span>
<span class="go">'green'</span>

<span class="gp">&gt;&gt;&gt; </span><span class="c1"># Update a value</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s2">"font"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"Helvetica"</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span>
<span class="go">{</span>
<span class="go">    'color': 'green',</span>
<span class="go">    'width': 42,</span>
<span class="go">    'height': 100,</span>
<span class="go">    'font': 'Helvetica'</span>
<span class="go">}</span>
</code></pre></div>
    
    <button class="codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only" title="Copy to clipboard"><span class="icon baseline"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></button>
    
  </div>

<p>A Python dictionary consists of a collection of key-value pairs, where each key corresponds to its associated value. In this example, <code>"color"</code> is a key, and <code>"green"</code> is the associated value.</p>
<p>Dictionaries are a fundamental part of Python. You’ll find them behind core concepts like scopes and namespaces as seen with the <a href="https://realpython.com/python-built-in-functions/">built-in functions</a> <code>globals()</code> and <code>locals()</code>:</p>

  <div class="codeblock__header codeblock--blue">
    <span class="mr-2 noselect">Python</span>
    
    <div class="noselect">
      
        <span class="codeblock__output-toggle" tabindex="0" title="Toggle prompts and output"><span class="icon baseline js-codeblock-output-on codeblock__header--icon-lower"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></span>
      
    </div>
  </div>
  <div class="codeblock__contents">
    <div class="highlight highlight--with-header"><pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="nb">globals</span><span class="p">()</span>
<span class="go">{</span>
<span class="go">    '__name__': '__main__',</span>
<span class="go">    '__doc__': None,</span>
<span class="go">    '__package__': None,</span>
<span class="go">    ...</span>
<span class="go">}</span>
</code></pre></div>
    
    <button class="codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only" title="Copy to clipboard"><span class="icon baseline"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></button>
    
  </div>

<p>The <code>globals()</code> function returns a dictionary containing key-value pairs that map names to objects that live in your current global scope.</p>
<p>Python also uses dictionaries to support the internal implementation of <a href="https://realpython.com/python-classes/">classes</a>. Consider the following demo class:</p>

  <div class="codeblock__header codeblock--blue">
    <span class="mr-2 noselect">Python</span>
    
    <div class="noselect">
      
        <span class="codeblock__output-toggle" tabindex="0" title="Toggle prompts and output"><span class="icon baseline js-codeblock-output-on codeblock__header--icon-lower"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></span>
      
    </div>
  </div>
  <div class="codeblock__contents">
    <div class="highlight highlight--with-header"><pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="k">class</span><span class="w"> </span><span class="nc">Number</span><span class="p">:</span>
<span class="gp">... </span>    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="gp">... </span>        <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
<span class="gp">...</span>

<span class="gp">&gt;&gt;&gt; </span><span class="n">Number</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span><span class="o">.</span><span class="vm">__dict__</span>
<span class="go">{'value': 42}</span>
</code></pre></div>
    
    <button class="codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only" title="Copy to clipboard"><span class="icon baseline"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></button>
    
  </div>

<p>The <a href="https://realpython.com/python-dict-attribute/"><code>.__dict__</code></a> special attribute is a dictionary that maps attribute names to their corresponding values in Python classes and objects. This implementation makes attribute and method lookup fast and efficient in <a href="https://realpython.com/python3-object-oriented-programming/">object-oriented</a> code.</p>
<p>You can use dictionaries to approach many programming tasks in your Python code. They come in handy when processing <a href="https://realpython.com/python-csv/">CSV</a> and <a href="https://realpython.com/python-json/">JSON</a> files, working with databases, loading configuration files, and more.</p>
<p>Python’s dictionaries have the following characteristics:</p>
<ul>
<li><strong>Mutable</strong>: The dictionary values can be updated <a href="https://en.wikipedia.org/wiki/In-place_algorithm">in place</a>.</li>
<li><strong>Dynamic</strong>: Dictionaries can grow and shrink as needed.</li>
<li><strong>Efficient</strong>: They’re implemented as <a href="https://realpython.com/python-hash-table/">hash tables</a>, which allows for fast key lookup.</li>
<li><strong>Ordered</strong>: Starting with <a href="https://realpython.com/python37-new-features/">Python 3.7</a>, dictionaries keep their items in the same <a href="https://realpython.com/python37-new-features/#the-order-of-dictionaries-is-guaranteed">order</a> they were inserted.</li>
</ul>
<p>The keys of a dictionary have a couple of restrictions. They need to be:</p>
<ul>
<li><strong>Hashable</strong>: This means that you can’t use unhashable objects like lists as dictionary keys.</li>
<li><strong>Unique</strong>: This means that your dictionaries won’t have duplicate keys.</li>
</ul>
<p>In contrast, the values in a dictionary aren’t restricted. They can be of any Python type, including other dictionaries, which makes it possible to have nested dictionaries.</p>
<p>Dictionaries are collections of pairs. So, you can’t insert a key without its corresponding value or vice versa. Since they come as a pair, you always have to insert a key with its corresponding value.</p>
<div class="alert alert-primary">
<p><strong>Note:</strong> In some situations, you may want to add keys to a dictionary without deciding what the associated value should be. In those cases, you can use the <a href="https://realpython.com/atom.xml#setting-one-key-setdefaultkey-defaultnone"><code>.setdefault()</code></a> method to create keys with a default or placeholder value.</p>
</div>
</div><h2><a href="https://realpython.com/python-dicts/?utm_source=realpython&amp;utm_medium=rss">Read the full article at https://realpython.com/python-dicts/ »</a></h2>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-08T14:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://realpython.com/quizzes/factory-method-pattern/">
	<title>Real Python: Quiz: Implementing the Factory Method Pattern in Python</title>
	<link>https://realpython.com/quizzes/factory-method-pattern/</link>
	
	<content:encoded><p>In this quiz, you&rsquo;ll test your understanding of
<a href="https://realpython.com/courses/factory-method-pattern/">Factory Method Pattern</a>.</p>
<p>This quiz guides you through the Factory Method pattern: how it separates object creation from use, the roles of clients and products, when to apply it, and how to implement flexible, maintainable Python classes.</p>
<p>Test your ability to spot opportunities for the pattern and build reusable, decoupled object creation solutions.</p>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-08T12:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://lucumr.pocoo.org/2026/4/8/mario-and-earendil/">
	<title>Armin Ronacher: Mario and Earendil</title>
	<link>https://lucumr.pocoo.org/2026/4/8/mario-and-earendil/</link>
	
	<content:encoded><p>Today I&#8217;m very happy to share that Mario Zechner is joining <a href="https://earendil.com/">Earendil</a>.</p>
<p>First things first: I think you should <a href="https://mariozechner.at/posts/2026-04-08-ive-sold-out/">read Mario&#8217;s
post</a>.  This is his news
more than it is ours, and he tells his side of it better than I could.  What I
want to do here is add a more personal note about why this matters so much to
me, how the last months led us here, and why I am so excited to have him on
board.</p>
<p>Last year changed the way many of us thought about software.  It certainly
changed the way I did.  I spent much of 2025 building, probing, and questioning
how to build software, and in many more ways what I want to do.  If you are a
regular reader of this blog you were along for the ride.  I wrote a lot,
experimented a lot, and tried to get a better sense for what these systems can
actually do and what kinds of companies make sense to build around them.  There
was, and continues to be, a lot of excitement in the air, but also a lot of
noise.  It has become clear to me that it&#8217;s not a question of whether AI systems
can be useful but what kind of software and human-machine interactions we want
to bring into the world with them.</p>
<p>That is one of the reasons I have been so drawn to Mario&#8217;s work and approaches.</p>
<p><a href="https://pi.dev/">Pi</a> is, in my opinion, one of the most thoughtful
coding agents and agent infrastructure libraries in this space.  Not because it
is trying to be the loudest or the fastest, but because it is clearly built by
someone who cares deeply about software quality, taste, extensibility, and
design.  In a moment where much of the industry is racing to ship ever more
quickly, often at the cost of coherence and craft, Mario kept insisting on
making something solid. That matters to me a great deal.</p>
<p>I have known Mario for a long time, and one of the things I admire most about
him is that he does not confuse velocity with progress.  He has a strong sense
for what good tools should feel like.  He cares about details. He cares about
whether something is well made.  And he cares about building in a way that can
last.  Mario has been running Pi in a rather unusual way. He exerts back-pressure
on the issue tracker and the pull requests through OSS vacations and other
means.</p>
<p>The last year has also made something else clearer to me: these systems are not
only exciting, they are also capable of producing a great deal of damage.
Sometimes that damage is obvious; sometimes it looks like low-grade degradation
everywhere at once.  More slop, more noise, more disingenuous emails in my inbox.
There is a version of this future that makes people more distracted, more
alienated, and less careful with one another.</p>
<p>That is not a future I want to help build.</p>
<p>At Earendil, Colin and I have been trying to think very carefully about what a
different path might look like.  That is a big part of what led us to <a href="https://lefos.com/">Lefos</a>.</p>
<p>Lefos is our attempt to build a machine entity that is more thoughtful and more
deliberate by design.  Not an agent whose main purpose is to make everything a
little more efficient so that we can produce even more forgettable output, but
one that can help people communicate with more care, more clarity, and joy.</p>
<p>Good software should not aim to optimize every minute of your life, but should
create room for better and more joyful experiences, better relationships, and
better ways of relating to one another.  Especially in communication and software
engineering, I think we should be aiming for more thought rather than more
throughput.  We should want tools that help people be more considerate, more
present, and more human.  If all we do is use these systems to accelerate the
production of slop, we will have missed the opportunity entirely.</p>
<p>This is also why Mario joining Earendil feels so meaningful to me.  Pi and Lefos
come from different starting points.  There was a year of distance collaboration,
but they are animated by a similar instinct: that quality matters, that design
matters, and that trust is earned through care rather than captured through
hype.</p>
<p>I am very happy that Pi is coming along for the ride.  Me and Colin care a lot
about it, and we want to be good stewards of it.  It has already played an
important role in our own work over the last months, and I continue to believe
it is one of the best foundations for building capable agents.  We will have more
to say soon about how we think about Pi&#8217;s future and its relationship to Lefos,
but the short version is simple: we want Pi to continue to exist as a
high-quality, open, extensible piece of software, and we want to invest in
making that future real.  As for our thoughts of Pi&#8217;s license, <a href="https://rfc.earendil.com/0015/">read more
here</a> and our <a href="https://earendil.com/posts/announcement-reflection/">company post
here</a>.</p></content:encoded>
	
	<dc:date>2026-04-08T00:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://pycoders.com/issues/729">
	<title>PyCoder’s Weekly: Issue #729: NumPy Music, Ollama, Iterables, and More (April 7, 2026)</title>
	<link>https://pycoders.com/issues/729</link>
	
	<content:encoded><p> <span>#729 – APRIL 7, 2026</span><br /> <span><a href="https://pycoders.com/issues/729/feed">View in Browser »</a></span> </p> <p><a href="https://pycoders.com"><img alt="The PyCoder&rsquo;s Weekly Logo" src="https://cdn.pycoders.com/37bdf31dc645f968ffb90196e5d38ff5" /></a></p> <hr /> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16226/feed" target="_blank">NumPy as Synth Engine</a></h3> <p style="margin-bottom: 0;"> Kenneth has &ldquo;recorded&rdquo; a song in a Python script. The catch? No sampling, no recording, no pre-recorded sound. Everything was done through generating wave functions in NumPy. Learn how to become a mathematical musician.<br /> <span><a href="https://pycoders.com/link/16226/feed" target="_blank">KENNETH REITZ</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16238/feed" target="_blank">How to Use Ollama to Run Large Language Models Locally</a></h3> <p style="margin-bottom: 0;"> Learn how to use Ollama to run large language models locally. Install it, pull models, and start chatting from your terminal without needing API keys.<br /> <span><a href="https://pycoders.com/link/16238/feed" target="_blank">REAL PYTHON</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16222/feed" target="_blank">Ship AI Agents With Accurate, Fresh Web Search Data</a></h3> <a href="https://pycoders.com/link/16222/feed" target="_blank"><img alt="alt" src="https://cdn.pycoders.com/829c8a2d3c3a74ff2a229135a72a9343" style="float: right; margin-left: 16px; margin-top: 7px; width: 17%;" /></a> <p style="margin-bottom: 0;"> Stop building scrapers just to feed your AI app web search data. SerpApi returns structured JSON from Google and 100+ search engines via a simple GET request. No proxy management, no CAPTCHAs. Power product research, price tracking, or agentic search in minutes. <a href="https://pycoders.com/link/16222/feed" target="_blank">Used by Shopify, NVIDIA, and Uber →</a><br /> <span><a href="https://pycoders.com/link/16222/feed" target="_blank">SERPAPI</a></span> <span style="color: #AAAAAA; padding: 1px 4px; border: 1px solid #dddddd; margin-left: 4px; font-size: 0.8em; border-radius: 2px; background-color: #ffffe0;">sponsor</span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16223/feed" target="_blank">Indexable Iterables</a></h3> <p style="margin-bottom: 0;"> Learn how objects are automatically iterable if you implement integer indexing.<br /> <span><a href="https://pycoders.com/link/16223/feed" target="_blank">RODRIGO GIRÃO SERRÃO</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16232/feed" target="_blank">Claude Code for Python Developers (Live Course)</a></h3> <p style="margin-bottom: 0;"> &ldquo;This is one of the best training sessions I&rsquo;ve joined in the last year across multiple platforms.&rdquo; Two-day course where you build a complete Python project with an AI agent in your terminal. Next session April 11–12.<br /> <span><a href="https://pycoders.com/link/16232/feed" target="_blank">REAL PYTHON</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16236/feed" target="_blank">PEP 803: <code>"abi3t"</code>: Stable ABI for Free-Threaded Builds (Accepted)</a></h3> <p style="margin-bottom: 0;"> <span><a href="https://pycoders.com/link/16236/feed" target="_blank">PYTHON.ORG</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16254/feed" target="_blank">PEP 829: Structured Startup Configuration via .site.toml Files (Added)</a></h3> <p style="margin-bottom: 0;"> <span><a href="https://pycoders.com/link/16254/feed" target="_blank">PYTHON.ORG</a></span> </p> </div> <h2>Articles &amp; Tutorials</h2> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16228/feed" target="_blank">Fire and Forget at Textual</a></h3> <p style="margin-bottom: 0;"> In this follow up to a previous article (<a href="https://pycoders.com/link/16237/feed" target="_blank">Fire and forget (or never) with Python&rsquo;s asyncio</a>, Michael discusses a similar article by Will McGugan as it relates to Textual. He found the problematic pattern in over 500K GitHub files.<br /> <span><a href="https://pycoders.com/link/16228/feed" target="_blank">MICHAEL KENNEDY&#x27;</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16252/feed" target="_blank">pixi: One Package Manager for Python Libraries</a></h3> <p style="margin-bottom: 0;"> uv is great for pure Python projects, but it can&rsquo;t install compiled system libraries like GDAL or CUDA. pixi fills that gap by managing both PyPI and conda-forge packages in one tool, with fast resolution, automatic lockfiles, and project-level environments.<br /> <span><a href="https://pycoders.com/link/16252/feed" target="_blank">CODECUT.AI</a> • Shared by <a href="https://pycoders.com/link/16234/feed" target="_blank">Khuyen Tran</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16221/feed" target="_blank">Dignified Python: Pytest for Agent-Generated Code</a></h3> <a href="https://pycoders.com/link/16221/feed" target="_blank"><img alt="alt" src="https://cdn.pycoders.com/1f2ba5720af984e0eb8518d608c755d7" style="float: right; margin-left: 16px; margin-top: 7px; width: 17%;" /></a> <p style="margin-bottom: 0;"> Learn how to define clear pytest patterns for agent-generated tests: separate fast unit vs integration, use fakes, constrain generation, and avoid brittle patterns to <a href="https://pycoders.com/link/16221/feed" target="_blank">keep tests reliable and maintainable →</a><br /> <span><a href="https://pycoders.com/link/16221/feed" target="_blank">DAGSTER LABS</a></span> <span style="color: #AAAAAA; padding: 1px 4px; border: 1px solid #dddddd; margin-left: 4px; font-size: 0.8em; border-radius: 2px; background-color: #ffffe0;">sponsor</span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16235/feed" target="_blank">Learning Rust Made Me a Better Python Developer</a></h3> <p style="margin-bottom: 0;"> Bob thinks that learning Rust made him a better Python developer. Not because Rust is better, but because it made him think differently about how he has been writing Python. The compiler forced him to confront things he&rsquo;d been ignoring.<br /> <span><a href="https://pycoders.com/link/16235/feed" target="_blank">BOB BELDERBOS</a> • Shared by <a href="https://pycoders.com/link/16249/feed" target="_blank">Bob Belderbos</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16227/feed" target="_blank">Django <code>bulk_update</code> Memory Issue</a></h3> <p style="margin-bottom: 0;"> Recently, Anže had to write a Django migration to update hundreds of thousands of database objects. With some paper-napkin math he calculated it could fit in memory, but that turned out not to be the case. Read on to find out why.<br /> <span><a href="https://pycoders.com/link/16227/feed" target="_blank">ANŽE&#x27;S BLOG</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16225/feed" target="_blank">Catching Up With the Python Typing Council</a></h3> <p style="margin-bottom: 0;"> Talk Python interviews Carl Meyer, Jelle Zijstra, and Rebecca Chen, three members of the Python Typing Council. They talk about how the typing system is governed and just how much is the right amount of type hinting in your code.<br /> <span><a href="https://pycoders.com/link/16225/feed" target="_blank">TALK PYTHON</a></span> <span style="color: #AAAAAA; padding: 1px 4px; border: 1px solid #dddddd; margin-left: 4px; font-size: 0.8em; border-radius: 2px;">podcast</span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16245/feed" target="_blank">Python 3.3: The Version That Quietly Rewired Everything</a></h3> <p style="margin-bottom: 0;"> <code>yield from</code>, <code>venv</code>, and namespace packages are three features from Python 3.3 that looked minor when they came out in 2012, but turned out to be the scaffolding modern Python is built on.<br /> <span><a href="https://pycoders.com/link/16245/feed" target="_blank">TUREK SENTURK</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16241/feed" target="_blank">Incident Report: LiteLLM/Telnyx Supply-Chain Attacks</a></h3> <p style="margin-bottom: 0;"> This post from the PyPI blog outlines two recent supply chain attacks, how they were different, and how you can protect yourself from future incidents.<br /> <span><a href="https://pycoders.com/link/16241/feed" target="_blank">PYPI.ORG</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16233/feed" target="_blank">Python Classes: The Power of Object-Oriented Programming</a></h3> <p style="margin-bottom: 0;"> Learn how to define and use Python classes to implement object-oriented programming. Dive into attributes, methods, inheritance, and more.<br /> <span><a href="https://pycoders.com/link/16233/feed" target="_blank">REAL PYTHON</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16247/feed" target="_blank">Timesliced Reservoir Sampling for Profilers</a></h3> <p style="margin-bottom: 0;"> Reservoir sampling lets you pick a sample from an unlimited stream of events; learn how it works, and a new variant useful for profilers.<br /> <span><a href="https://pycoders.com/link/16247/feed" target="_blank">ITAMAR TURNER-TRAURING</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16248/feed" target="_blank">Adding Python to PATH</a></h3> <p style="margin-bottom: 0;"> Learn how to add Python to your PATH environment variable on Windows, macOS, and Linux so you can run Python from the command line.<br /> <span><a href="https://pycoders.com/link/16248/feed" target="_blank">REAL PYTHON</a></span> <span style="color: #AAAAAA; padding: 1px 4px; border: 1px solid #dddddd; margin-left: 4px; font-size: 0.8em; border-radius: 2px;">course</span> </p> </div> <h2>Projects &amp; Code</h2> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16253/feed" target="_blank">OracleTrace: Visualize Function Flows</a></h3> <p style="margin-bottom: 0;"> <span><a href="https://pycoders.com/link/16253/feed" target="_blank">GITHUB.COM/KAYKCAPUTO</a> • Shared by Kayk Aparecido de Paula Caputo</span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16224/feed" target="_blank">pywho: Explain Your Python Environment and Detect Shadows</a></h3> <p style="margin-bottom: 0;"> <span><a href="https://pycoders.com/link/16224/feed" target="_blank">GITHUB.COM/AHSANSHERAZ</a> • Shared by <a href="https://pycoders.com/link/16255/feed" target="_blank">Ahsan Sheraz </a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16251/feed" target="_blank">asyncstdlib: The Missing Toolbox for an Async World</a></h3> <p style="margin-bottom: 0;"> <span><a href="https://pycoders.com/link/16251/feed" target="_blank">GITHUB.COM/MAXFISCHER2781</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16239/feed" target="_blank">nitro-pandas: pandas-Compatible Polars Wrapper</a></h3> <p style="margin-bottom: 0;"> <span><a href="https://pycoders.com/link/16239/feed" target="_blank">GITHUB.COM/WASSIM17LABDI</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16244/feed" target="_blank">django-mail-auth: Django Auth via Login URLs</a></h3> <p style="margin-bottom: 0;"> <span><a href="https://pycoders.com/link/16244/feed" target="_blank">GITHUB.COM/CODINGJOE</a></span> </p> </div> <h2>Events</h2> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16229/feed" target="_blank">Weekly Real Python Office Hours Q&amp;A (Virtual)</a></h3> <p style="margin-bottom: 0;"> April 8, 2026<br /> <span><a href="https://pycoders.com/link/16229/feed" target="_blank">REALPYTHON.COM</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16231/feed" target="_blank">PyCon Lithuania 2026</a></h3> <p style="margin-bottom: 0;"> April 8 to April 11, 2026<br /> <span><a href="https://pycoders.com/link/16231/feed" target="_blank">PYCON.LT</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16246/feed" target="_blank">Python Atlanta</a></h3> <p style="margin-bottom: 0;"> April 9 to April 10, 2026<br /> <span><a href="https://pycoders.com/link/16246/feed" target="_blank">MEETUP.COM</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16242/feed" target="_blank">DFW Pythoneers 2nd Saturday Teaching Meeting</a></h3> <p style="margin-bottom: 0;"> April 11, 2026<br /> <span><a href="https://pycoders.com/link/16242/feed" target="_blank">MEETUP.COM</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16240/feed" target="_blank">PyCon DE &amp; PyData 2026</a></h3> <p style="margin-bottom: 0;"> April 14 to April 18, 2026<br /> <span><a href="https://pycoders.com/link/16240/feed" target="_blank">PYCON.DE</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16230/feed" target="_blank">DjangoCon Europe 2026</a></h3> <p style="margin-bottom: 0;"> April 15 to April 20, 2026<br /> <span><a href="https://pycoders.com/link/16230/feed" target="_blank">DJANGOCON.EU</a></span> </p> </div> <div> <h3 style="margin-bottom: 0;"><a href="https://pycoders.com/link/16250/feed" target="_blank">PyTexas 2026</a></h3> <p style="margin-bottom: 0;"> April 17 to April 20, 2026<br /> <span><a href="https://pycoders.com/link/16250/feed" target="_blank">PYTEXAS.ORG</a></span> </p> </div> <hr /> <p>Happy Pythoning!<br />This was PyCoder&rsquo;s Weekly Issue #729.<br /><a href="https://pycoders.com/issues/729/feed">View in Browser »</a></p> <img alt="alt" height="1" src="https://pycoders.com/issues/729/open/feed" width="1" /> 
        <hr />
        <p><em>[ Subscribe to 🐍 PyCoder&rsquo;s Weekly 💌 – Get the best Python news, articles, and tutorials delivered to your inbox once a week <a href="https://pycoders.com/?utm_source=pycoders&amp;utm_medium=feed&amp;utm_campaign=footer">&gt;&gt; Click here to learn more</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-07T19:30:00+00:00</dc:date>
	
</item>

<item rdf:about="https://devblogs.microsoft.com/python/write-sql-your-way-dual-parameter-style-benefits-in-mssql-python/">
	<title>Python Engineering at Microsoft: Write SQL Your Way: Dual Parameter Style Benefits in mssql-python</title>
	<link>https://devblogs.microsoft.com/python/write-sql-your-way-dual-parameter-style-benefits-in-mssql-python/</link>
	
	<content:encoded><p><a href="https://devblogs.microsoft.com/python/wp-content/uploads/sites/12/2025/09/Python_SQL_img.png"><img alt="Python SQL img image" class=" wp-image-10181 aligncenter" height="544" src="https://devblogs.microsoft.com/python/wp-content/uploads/sites/12/2025/09/Python_SQL_img-300x152.png" width="1074" /></a></p>
<p><span class="TextRun SCXW11324769 BCX8" lang="EN-IN" xml:lang="EN-IN"><span class="NormalTextRun CommentStart SCXW11324769 BCX8"><em>Reviewed by: Sumit Sarabhai</em></span></span></p>
<p>If <span class="NormalTextRun SCXW11324769 BCX8">you&#8217;ve</span><span class="NormalTextRun SCXW11324769 BCX8"> been writing SQL in Python, you already know the debate: <strong>positional parameters (?)</strong> or <strong>named parameters (%(name)s)</strong>? Some developers swear by the conciseness of positional. Others prefer the clarity of named. With <strong><a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://github.com/microsoft/mssql-python" id="menurrmp" rel="noreferrer noopener" target="_blank" title="https://github.com/microsoft/mssql-python">mssql-python</a></strong></span><span class="NormalTextRun SCXW11324769 BCX8">, you no longer need to choose </span><span class="NormalTextRun SCXW11324769 BCX8">&#8211;</span><span class="NormalTextRun SCXW11324769 BCX8"> we support </span><span class="NormalTextRun CommentStart SCXW11324769 BCX8">both</span><span class="NormalTextRun SCXW11324769 BCX8">.</span><span class="LineBreakBlob BlobObject DragDrop SCXW11324769 BCX8"><span class="SCXW11324769 BCX8"> </span><br class="SCXW11324769 BCX8" /></span><span class="LineBreakBlob BlobObject DragDrop SCXW11324769 BCX8"><span class="SCXW11324769 BCX8"> </span><br class="SCXW11324769 BCX8" /></span><span class="TextRun SCXW11324769 BCX8" lang="EN-IN" xml:lang="EN-IN"><span class="NormalTextRun SCXW11324769 BCX8">We&#8217;ve added dual parameter style support to </span><span class="NormalTextRun SpellingErrorV2Themed SCXW11324769 BCX8">mssql</span><span class="NormalTextRun SCXW11324769 BCX8">-python, enabling both </span><span class="NormalTextRun SpellingErrorV2Themed SCXW11324769 BCX8">qmark</span><span class="NormalTextRun SCXW11324769 BCX8"> and </span><span class="NormalTextRun SpellingErrorV2Themed SCXW11324769 BCX8">pyformat</span><span class="NormalTextRun SCXW11324769 BCX8"> parameter styles in Python applications that interact with SQL Server and Azure SQL</span><span class="NormalTextRun SCXW11324769 BCX8">. This feature is especially useful if </span><span class="NormalTextRun SCXW11324769 BCX8">you’re</span><span class="NormalTextRun SCXW11324769 BCX8"> building complex queries, dynamically assembling filters, or migrating existing code that already uses named parameters with other DB</span></span><span class="TextRun SCXW11324769 BCX8" lang="EN-IN" xml:lang="EN-IN"><span class="NormalTextRun SCXW11324769 BCX8">API drivers.
</span></span></p>
<p><div class="alert alert-info"><p class="alert-divider"><i class="fabric-icon fabric-icon--Info"></i><strong>Try it here</strong></p> You can install driver using <a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://pypi.org/project/mssql-python/" id="menurrq4" rel="noreferrer noopener" target="_blank" title="https://github.com/microsoft/mssql-python"><strong>pip install mssql-python</strong></a></p>
<p>Calling all Python + SQL developers! We invite the community to try out mssql-python and help us shape the future of high-performance <a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://github.com/microsoft/mssql-python" id="menurrq6" rel="noreferrer noopener" target="_blank" title="https://github.com/microsoft/mssql-python">SQL Server connectivity in Python</a>.!</div></p>
<p><span style="font-size: 18pt;"><b>What Are Parameter Styles?</b></span><span> </span></p>
<p><span>The </span><a href="https://peps.python.org/pep-0249/#paramstyle"><span>DB-API 2.0 specification (PEP 249)</span></a><span> defines several ways to pass parameters to SQL queries. The two most popular are:</span><span> </span></p>
<ul>
<li><b><span>qmark</span></b><span> &#8211; Positional </span><span>?</span><span> placeholders with a tuple/list of values.</span><span> </span></li>
<li><b><span>pyformat</span></b><span> &#8211; Named </span><span>%(name)s</span><span> placeholders with a dictionary of values.</span><span><span>
</span></span></p>
<pre class="prettyprint language-py"><code class="language-py"># qmark style 
cursor.execute("SELECT * FROM users WHERE id = ? AND status = ?", (42, "active")) 
 
# pyformat style 
cursor.execute("SELECT * FROM users WHERE id = %(id)s AND status = %(status)s", 
               {"id": 42, "status": "active"}) </code></pre>
</li>
</ul>
<p><span style="font-size: 18pt;"><b>Business Requirement</b> </span></p>
<p><span>Previously, </span><span>mssql-python</span><span> only supported </span><span>qmark</span><span>. It works fine for simple queries, but as parameters multiply, tracking their order becomes error-prone:</span><span> </span></p>
<pre class="prettyprint language-py"><code class="language-py"># Which ? corresponds to which value? 
cursor.execute( 
    "UPDATE users SET name=?, email=?, age=? WHERE id=? AND status=?", 
    (name, email, age, user_id, status) 
) </code></pre>
<p><span>Mix up the order and it’s easy to introduce subtle, hard </span><span>to </span><span>spot bugs.</span><span> </span></p>
<p><span style="font-size: 18pt;"><b>Why Named Parameters?</b></span><span> </span></p>
<ul>
<li><b><span>Self-documenting queries</span></b><span> &#8211; No more guessing which </span><span>?</span><span> maps to what:</span><span> </span></li>
</ul>
<pre class="prettyprint language-py"><code class="language-py">qmark — 6 parameters, which is which? 
cursor.execute( """INSERT INTO employees (first_name, last_name, email, department, salary, hire_date) VALUES (?, ?, ?, ?, ?, ?)""", ("Jane", "Doe", "jane.doe@company.com", "Engineering", 95000, "2025-03-01") ) 
pyformat — every value is labeled 
cursor.execute( """INSERT INTO employees (first_name, last_name, email, department, salary, hire_date) VALUES (%(first_name)s, %(last_name)s, %(email)s, %(dept)s, %(salary)s, %(hire_date)s)""", {"first_name": "Jane", "last_name": "Doe", "email": "jane.doe@company.com", "dept": "Engineering", "salary": 95000, "hire_date": "2025-03-01"} ) </code></pre>
<ul>
<li><b><span>Parameter reuse</span></b><span> &#8211; Use the same value multiple times without repeating it:</span><span> </span></li>
</ul>
<pre class="prettyprint language-py"><code class="language-py">Audit log: record who made the change and when 
cursor.execute( """UPDATE orders SET status = %(new_status)s, modified_by = %(user)s, approved_by = %(user)s, modified_at = %(now)s, approved_at = %(now)s WHERE order_id = %(order_id)s""", {"new_status": "approved", "user": "admin@company.com", "now": datetime.now(), "order_id": 5042} ) 
3 unique values, used 5 times — no duplication needed </code></pre>
<ul>
<li><b><span>Dynamic query building</span></b><span> &#8211; Add filters without tracking parameter positions:</span></li>
</ul>
<pre class="prettyprint language-py"><code class="language-py">def search_orders(customer=None, status=None, min_total=None, date_from=None): 
    query_parts = ["SELECT * FROM orders WHERE 1=1"] 
    params = {} 
  
    if customer: 
        query_parts.append("AND customer_id = %(customer)s") 
        params["customer"] = customer 
  
    if status: 
        query_parts.append("AND status = %(status)s") 
        params["status"] = status 
  
    if min_total is not None: 
        query_parts.append("AND total &gt;= %(min_total)s") 
        params["min_total"] = min_total 
  
    if date_from: 
        query_parts.append("AND order_date &gt;= %(date_from)s") 
        params["date_from"] = date_from 
  
    query_parts.append("ORDER BY order_date DESC") 
    cursor.execute(" ".join(query_parts), params) 
    return cursor.fetchall() 
  
# Callers use only the filters they need 
recent_big_orders = search_orders(min_total=500, date_from="2025-01-01") 
pending_for_alice = search_orders(customer=42, status="pending") </code></pre>
<ul>
<li><b><span>Dictionary Reuse Across Queries</span></b><span> </span></li>
</ul>
<p><span>The same parameter dictionary can drive multiple queries:</span></p>
<pre class="prettyprint language-py"><code class="language-py">report_params = {"region": "West", "year": 2025, "status": "active"} 
  
# Summary count 
cursor.execute( 
    """SELECT COUNT(*) FROM customers 
       WHERE region = %(region)s AND status = %(status)s""", 
    report_params 
) 
total = cursor.fetchone()[0] 
  
# Revenue breakdown 
cursor.execute( 
    """SELECT department, SUM(revenue) 
       FROM sales 
       WHERE region = %(region)s AND fiscal_year = %(year)s 
       GROUP BY department 
       ORDER BY SUM(revenue) DESC""", 
    report_params 
) 
breakdown = cursor.fetchall() 
  
# Top performers 
cursor.execute( 
    """SELECT name, revenue 
       FROM sales_reps 
       WHERE region = %(region)s AND fiscal_year = %(year)s AND status = %(status)s 
       ORDER BY revenue DESC""", 
    report_params 
) 
top_reps = cursor.fetchall() 
# Same dict, three different queries — change the filters once, all queries update </code></pre>
<p><span style="font-size: 18pt;"><b>The Solution: Automatic Detection</b></span><span> </span></p>
<p><span>mssql-python</span><span> now detects which style you&#8217;re using based on the parameter type:</span><span> </span></p>
<ul>
<li><b><span>tuple/list</span></b><span> → </span><span>qmark</span><span> (</span><span>?</span><span>)</span><span> </span></li>
</ul>
<ul>
<li><b><span>dict</span></b><span> → </span><span>pyformat</span><span> (</span><span>%(name)s</span><span>)</span><span> </span></li>
</ul>
<p><span>No configuration needed. Existing </span><span>qmark</span><span> code requires </span><b><span>zero changes</span></b><span>.</span><span> </span></p>
<pre class="prettyprint language-py"><code class="language-py">from mssql_python import connect 
 
# qmark - works exactly as before 
cursor.execute("SELECT * FROM users WHERE id = ?", (42,)) 
 
# pyformat - just pass a dict! 
cursor.execute("SELECT * FROM users WHERE id = %(id)s", {"id": 42})</code></pre>
<p><span style="font-size: 18pt;"><b>How It Works</b> </span></p>
<p><span>When you pass a dict to </span><span>execute()</span><span>, the driver:</span><span> </span></p>
<ol>
<li><b><span>Scans</span></b><span> the SQL for </span><span>%(name)s</span><span> placeholders (context-aware &#8211; skips string literals, comments, and bracketed identifiers).</span><span> </span></li>
<li><b><span>Validates</span></b><span> that every placeholder has a matching key in the dict.</span><span> </span></li>
<li><b><span>Builds</span></b><span> a positional tuple in placeholder order (duplicating values for reused parameters).</span><span> </span></li>
<li><b><span>Replaces</span></b><span> each </span><span>%(name)s</span><span> with </span><span>?</span><span> and sends the rewritten query to ODBC.</span><span> </span></li>
</ol>
<pre class="prettyprint language-py"><code class="language-py">User Code                                  ODBC Layer 
─────────                                  ────────── 
cursor.execute(                            SQLBindParameter(1, "active") 
  "WHERE status = %(status)s               SQLBindParameter(2, "USA") 
   AND country = %(country)s",      →      SQLExecute( 
  {"status": "active",                       "WHERE status = ? 
   "country": "USA"}                          AND country = ?" 
)                                          ) </code></pre>
<p><span>The ODBC layer always works with positional </span><span>?</span><span> placeholders. The pyformat conversion is purely a developer-facing convenience with zero overhead to database communication.</span><span> </span></p>
<p><span style="font-size: 18pt;"><b>Clear Error Messages</b> </span></p>
<p><span>Mismatched styles or missing parameters produce actionable errors &#8211; not cryptic database exceptions:</span><span> </span></p>
<pre class="prettyprint language-py"><code class="language-py">cursor.execute("WHERE id = %(id)s AND name = %(name)s", {"id": 42}) 
# KeyError: Missing required parameter(s): 'name'. 
 
cursor.execute("WHERE id = ?", {"id": 42}) 
# TypeError: query uses positional placeholders (?), but dict was provided. 
 
cursor.execute("WHERE id = %(id)s", (42,)) 
# TypeError: query uses named placeholders (%(name)s), but tuple was provided.</code></pre>
<p><span style="font-size: 18pt;"><b>Real-World Examples</b> </span></p>
<p><b><span><span style="font-size: 14pt;"><strong>Example 1: </strong></span>Web Application</span></b></p>
<pre class="prettyprint language-py"><code class="language-py">def add_user(name, email): 
    with connect(connection_string) as conn: 
        with conn.cursor() as cursor: 
            cursor.execute( 
                "INSERT INTO users (name, email) VALUES (%(name)s, %(email)s)", 
                {"name": name, "email": email} 
            ) </code></pre>
<p><b><span><span style="font-size: 14pt;"><strong>Example 2: </strong></span>Batch Operations</span></b><span> </span></p>
<pre class="prettyprint language-py"><code class="language-py">cursor.executemany( 
    "INSERT INTO users (name, age) VALUES (%(name)s, %(age)s)", 
    [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}] 
) </code></pre>
<p><b><span><span style="font-size: 14pt;"><strong>Example 3: </strong></span>Financial Transactions</span></b><span> </span></p>
<pre class="prettyprint language-py"><code class="language-py">def transfer_funds(from_acct, to_acct, amount): 
    with connect(connection_string) as conn: 
        with conn.cursor() as cursor: 
            cursor.execute( 
                "UPDATE accounts SET balance = balance - %(amount)s WHERE id = %(id)s", 
                {"amount": amount, "id": from_acct} 
            ) 
            cursor.execute( 
                "UPDATE accounts SET balance = balance + %(amount)s WHERE id = %(id)s", 
                {"amount": amount, "id": to_acct} 
            ) 
    # Automatic commit on success, rollback on failure </code></pre>
<p><span style="font-size: 18pt;"><b>Things to Keep in Mind</b> </span></p>
<ul>
<li><b><span>Don&#8217;t mix styles in one query</span></b><span>. Use either ? or %(name)s, not both. The driver determines which style you&#8217;re using from the parameter type (tuple vs dict), not from the SQL text. If placeholders don&#8217;t match the parameter type, you&#8217;ll get a clear TypeError explaining the mismatch. If both placeholder types appear in the SQL, only one set gets substituted, leading to parameter count mismatches at execution time.</span><span> </span></li>
</ul>
<pre class="prettyprint language-py"><code class="language-py"># Mixing styles - raises TypeError 
cursor.execute( "SELECT * FROM users WHERE id = ? AND name = %(name)s", {"name": "Alice"} # Driver finds %(name)s but also sees unmatched ? ) 
# ODBC error: parameter count mismatch (2 placeholders, 1 value) 
# Pick one style and use it consistently 
cursor.execute( "SELECT * FROM users WHERE id = %(id)s AND name = %(name)s", {"id": 42, "name": "Alice"} ) </code></pre>
<ul>
<li><b><span>Extra dict keys are OK.</span></b><span>  Unused parameters are silently ignored, this is by design to enable parameter dictionary reuse across different queries.</span><span> </span></li>
</ul>
<ul>
<li><b><span>SQL injection safe.</span></b><span> Both styles use ODBC parameter binding under the hood. Values are never interpolated into the SQL string, they are always safely bound by the driver.</span><span> </span></li>
</ul>
<ul>
<li><b><span>Literal </span></b><b><span>%</span></b><b><span> in SQL.</span></b><span> Use </span><span>%%</span><span> to escape if you need a literal </span><span>%(&#8230;)s</span><span> pattern in your query text.</span><span> </span></li>
</ul>
<pre class="prettyprint language-py"><code class="language-py">cursor.execute( 
    "SELECT * FROM users WHERE name LIKE %(pattern)s", 
    {"pattern": "%alice%"}  # The % inside the VALUE is fine 
) 
 
# But if you need a literal %(...)s in SQL text itself, use %% 
cursor.execute( 
    "SELECT '%%(example)s' AS literal WHERE id = %(id)s", 
    {"id": 42} 
) </code><span> </span></pre>
<ul>
<li><b><span>mssql_python.paramstyle reports &#8220;pyformat&#8221;</span></b><span>. The DB-API 2.0 spec only allows a single value for this module-level constant. We set it to pyformat because it&#8217;s the more expressive style and the one we recommend for new code. But qmark is fully supported at runtime, the driver accepts both styles transparently based on whether you pass a tuple or a dict. Think of paramstyle = &#8220;pyformat&#8221; as the advertised default, not a limitation.</span><span> </span></li>
</ul>
<p><span style="font-size: 18pt;"><b>Compatibility at a Glance</b> </span></p>
<table>
<tbody>
<tr>
<td><b><span>Feature</span></b><span> </span></td>
<td><b><span>qmark (?)</span></b><span> </span></td>
<td><b><span>pyformat (%</span></b><strong>(name)s</strong><b><span>)</span></b><span> </span></td>
</tr>
<tr>
<td><span>cursor.execute()</span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
</tr>
<tr>
<td><span>cursor.executemany()</span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
</tr>
<tr>
<td><span>connection.execute()</span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
</tr>
<tr>
<td><span>Parameter reuse</span><span> </span></td>
<td><span><img alt="❌" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" style="height: 1em;" /></span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
</tr>
<tr>
<td><span>Stored procedures</span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
</tr>
<tr>
<td><span>All SQL data types</span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
</tr>
<tr>
<td><span>Backward compatible with qmark paramstyle</span><span> </span></td>
<td><span><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /></span><span> </span></td>
<td><span>N/A (new)</span><span> </span></td>
</tr>
</tbody>
</table>
<p><span style="font-size: 18pt;"><b>Takeaway</b> </span></p>
<p><span>Use </span><span>?</span><span> for quick, simple queries. Use </span><span>%(name)s</span><span> for complex, multi-parameter queries where clarity and reuse matter. You don&#8217;t have to pick a side &#8211; use whichever fits the situation. The driver handles the rest.</span><span> </span></p>
<p><span>Whether you&#8217;re building dynamic queries, or simply want more readable SQL, dual paramstyle support makes </span><span>mssql-python</span><span> work the way you already think.</span><span> </span></p>
<p><strong><span style="font-size: 18pt;">Try It and Share Your Feedback! </span></strong></p>
<p>We invite you to:</p>
<ol>
<li>Check-out the <a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://github.com/microsoft/mssql-python" id="menurrmp" rel="noreferrer noopener" target="_blank" title="https://github.com/microsoft/mssql-python">mssql-python </a>driver and integrate it into your projects.</li>
<li>Share your thoughts: Open <a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://github.com/microsoft/mssql-python/issues" id="menurrmr" rel="noreferrer noopener" target="_blank" title="https://github.com/microsoft/mssql-python/issues">issues</a>, suggest features, and contribute to the project.</li>
<li>Join the conversation: <a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://github.com/microsoft/mssql-python/discussions" id="menurrmt" rel="noreferrer noopener" target="_blank" title="https://github.com/microsoft/mssql-python/discussions">GitHub Discussions</a> | <a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://techcommunity.microsoft.com/category/sql-server/blog/sqlserver" id="menurrmv" rel="noreferrer noopener" target="_blank" title="https://techcommunity.microsoft.com/category/sql-server/blog/sqlserver">SQL Server Tech Community</a>.</li>
</ol>
<p><div class="alert alert-success"><p class="alert-divider"><i class="fabric-icon fabric-icon--Lightbulb"></i><strong>Use Python Driver with Free Azure SQL Database</strong></p>You can use the Python Driver with the free version of Azure SQL Database!</p>
<p><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /> <a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://learn.microsoft.com/en-us/azure/azure-sql/database/free-offer?view=azuresql" id="menurrn1" rel="noreferrer noopener" target="_blank" title="https://learn.microsoft.com/en-us/azure/azure-sql/database/free-offer?view=azuresql">Deploy Azure SQL Database for free</a></p>
<p><img alt="✅" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" style="height: 1em;" /> <a class="fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn" href="https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/free-offer?view=azuresql" id="menurrn3" rel="noreferrer noopener" target="_blank" title="https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/free-offer?view=azuresql">Deploy Azure SQL Managed Instance for free</a> Perfect for testing, development, or learning scenarios without incurring costs.</div></p>
<p>&nbsp;</p>
<p>The post <a href="https://devblogs.microsoft.com/python/write-sql-your-way-dual-parameter-style-benefits-in-mssql-python/">Write SQL Your Way: Dual Parameter Style Benefits in mssql-python</a> appeared first on <a href="https://devblogs.microsoft.com/python">Microsoft for Python Developers Blog</a>.</p></content:encoded>
	
	<dc:date>2026-04-07T16:12:05+00:00</dc:date>
	
</item>

<item rdf:about="https://pycon.blogspot.com/2026/04/stories-from-pycon-us-hotels.html">
	<title>PyCon: Stories from the PyCon US Hotels</title>
	<link>https://pycon.blogspot.com/2026/04/stories-from-pycon-us-hotels.html</link>
	
	<content:encoded><p><span face="Arial, sans-serif" style="color: #666666; font-size: 15pt;">Friendships, collaborations, and breakthroughs&nbsp;</span></p><span id="docs-internal-guid-cc92111d-7fff-849b-755a-ebd716d2bf11"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">The fun, the learning, and the inspiration don't stop when you walk out of the convention center. Some of the most memorable moments from PyCon US happen in the lobby at 10 pm, laughing with someone you only knew as a username until an hour ago; over breakfast, where a casual conversation turns into a collaboration that lasts years; and on the walks to and from the conference. PyCon US hotels have their own lore.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">We asked people about their experiences and were overwhelmed, it turns out that everyone has a story!</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;">"</span><span face="Arial, sans-serif" style="background-color: white; color: #222222; font-size: 11pt; font-style: italic; vertical-align: baseline;">One story stands out to me beyond getting to know each other and sharing ideas. </span><span face="Arial, sans-serif" style="color: #222222; font-size: 11pt; font-style: italic; vertical-align: baseline;">When I was getting ready to give my first PyCon talk in Montreal, Selena Deckelmann offered to help review my slides and listen to me practice. We spent a few hours on the floor of her hotel room prepping while her very young daughter crawled around on the floor and chewed on my PyCon badge since she was teething. It's still one of my favorite PyCon and PyLadies memories.” - </span><span face="Arial, sans-serif" style="color: #222222; font-size: 11pt; vertical-align: baseline;">Carol Willing, Willing Consulting</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="color: #222222; font-size: 11pt; font-style: italic; vertical-align: baseline;">“The hotel lobby last year turned into a makeshift meetup after the PyLadies Auction. People were having a great time at the auction and kept the energy going in the lobby afterward. Everyone was there, even those who hadn't attended the auction. Luckily, the hotel also sold my favorite chocolate milk in the lobby, so I got to end my evening drinking milk and chatting with Python friends.” </span><span face="Arial, sans-serif" style="color: #222222; font-size: 11pt; vertical-align: baseline;">- Cheuk Ting Ho (the PyLady who loves the auction and karaoke)</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;">"In Pittsburgh a couple of years ago I was having breakfast at the hotel, when a guy I didn't know spotted my Python T-shirt and introduced himself. It was his first PyCon and my 21st, and we ended up having breakfast together. I gave him a few tips on enjoying a PyCon, but it turned out he was also a guitarist, so we spent most of breakfast talking about music and playing guitar.” - </span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Naomi Ceder, former board chair and loooong time PyCon goer</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;">"I ran into Trey Hunner during my first PyCon US in the hotel lobby as a PSF employee. He was running a Cabo game. He immediately welcomed me and showed me how to play. (He’s a great teacher, so I won three rounds in a row!) I also met a bunch of lovely people who have been attending PyCon US for years and years, and I learned that there is almost always a Cabo game in the hotel lobby." </span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">- Deb Nicholson (PSF Executive Director &amp; resident Cabo shark)</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;">“One of my most memorable hotel lobby moments was a chance encounter with Thomas Wouters. We fell into a natural conversation about his work and his deep, genuine pride in the Python Software Foundation community. He spoke warmly about the people who make the community what it is and what it means to him to be part of it. What I had no idea at the time was that just three days later, he would be called up on stage and announced as a Distinguished Service Award recipient — one of the highest honors the Python Software Foundation gives.” - </span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Abigail Dogbe, PSF Board Member</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="background-color: white; color: #222222; font-size: 11pt; font-style: italic; vertical-align: baseline;">“Juggling in the hotel lobby turned into an unexpected highlight of the conference. We had started teaching each other — my fault entirely for bringing the juggling balls — when a teenager and his mom wandered through on their way to see Pearl Jam. The kid's eyes lit up the moment he saw us, so I waved them over and started teaching him. Turns out they'd booked that very hotel hoping to cross paths with the band. He was excited about everything, and she was right there with him, every bit as thrilled.” - </span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Ned Batchelder, Python Core Team and Netflix, Software Engineer</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">And this year, instead of sitting in LA-to-Long Beach traffic, consider staying in the official conference hotel block because there's too much to miss if you're too far away.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 20pt; font-weight: 400; vertical-align: baseline;">Real Talk: Why booking a room via PyCon US matters&nbsp;</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">If you're planning to attend PyCon US, please consider booking your stay within the official conference hotel block.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">When attendees reserve rooms through the block, it helps the conference meet its contractual commitments with the venue, which directly impacts the overall cost of hosting the event.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Strong participation in the hotel block helps PyCon US:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Keep registration prices as low as possible while continuing to invest in programs that support our community, like travel grants, accessibility services, and community events.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">When rooms go unfilled in the block, the conference incurs major financial penalties that ultimately make the event more expensive to run for everyone.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">By booking in the hotel block, you are giving back and helping keep PyCon US sustainable and affordable for the entire Python community.</span></p><br /><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 20pt; font-weight: 400; vertical-align: baseline;">PSST! Exclusive swag when you book a room. We can't say more.</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Attendees who book within the official hotel block this year will receive a special mystery swag item. We can't tell you what it is. That's why it's called mystery swag. But we can tell you the only way to get it is to book in the official PyCon US hotel block.&nbsp;</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 20pt; font-weight: 400; vertical-align: baseline;">Where to stay: official PyCon US 2026 hotel block</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">All hotels are in Long Beach, within easy reach of the Long Beach Convention Center.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 700; vertical-align: baseline;">The Westin Long Beach</span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> Spacious rooms and great amenities, and the block still has availability. </span><a href="https://us.pycon.org/2026/venue/hotels/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;">&nbsp;</span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Book here</span></a></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 700; vertical-align: baseline;">Hyatt Regency Long Beach</span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> is the conference headquarters hotel. Closest to the convention center–just about connected. </span><a href="https://us.pycon.org/2026/venue/hotels/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;">&nbsp;</span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Book here</span></a></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 700; vertical-align: baseline;">Marriott Long Beach Downtown</span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> A solid choice with easy access to the convention center and the waterfront. </span><a href="https://us.pycon.org/2026/venue/hotels/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;">&nbsp;</span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Book here</span></a></p><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 700; vertical-align: baseline;">Courtyard by Marriott Long Beach Downtown</span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> A comfortable, more affordable option still within the block. </span><a href="https://us.pycon.org/2026/venue/hotels/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;">&nbsp;</span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Book here</span></a></span></content:encoded>
	
	<dc:date>2026-04-07T14:30:00+00:00</dc:date>
	
</item>

<item rdf:about="https://www.djangoproject.com/weblog/2026/apr/07/security-releases/">
	<title>Django Weblog: Django security releases issued: 6.0.4, 5.2.13, and 4.2.30</title>
	<link>https://www.djangoproject.com/weblog/2026/apr/07/security-releases/</link>
	
	<content:encoded><p>In accordance with <a class="reference external" href="https://docs.djangoproject.com/en/dev/internals/security/">our security release policy</a>, the Django team
is issuing releases for
<a class="reference external" href="https://docs.djangoproject.com/en/dev/releases/6.0.4/">Django 6.0.4</a>,
<a class="reference external" href="https://docs.djangoproject.com/en/dev/releases/5.2.13/">Django 5.2.13</a>, and
<a class="reference external" href="https://docs.djangoproject.com/en/dev/releases/4.2.30/">Django 4.2.30</a>.
These releases address the security issues detailed below. We encourage all
users of Django to upgrade as soon as possible.</p>
<div class="section" id="s-django-4-2-has-reached-the-end-of-extended-support">
<h3>Django 4.2 has reached the end of extended support</h3>
<p>Note that with this release, Django 4.2 has reached the end of extended support. All Django 4.2 users are encouraged to <a class="reference external" href="https://docs.djangoproject.com/en/dev/howto/upgrade-version/">upgrade</a> to Django 5.2 or later to continue receiving fixes for security issues.</p>
<p>See the <a class="reference external" href="https://www.djangoproject.com/download/#supported-versions">downloads page</a> for a table of supported versions and the future release schedule.</p>
</div>
<div class="section" id="s-cve-2026-3902-asgi-header-spoofing-via-underscore-hyphen-conflation">
<h3>CVE-2026-3902: ASGI header spoofing via underscore/hyphen conflation</h3>
<p><tt class="docutils literal">ASGIRequest</tt> normalizes header names following WSGI conventions, mapping
hyphens to underscores. As a result, even in configurations where reverse
proxies carefully strip security-sensitive headers named with hyphens, such a
header could be spoofed by supplying a header named with underscores.</p>
<p>Under WSGI, it is the responsibility of the server or proxy to avoid ambiguous
mappings. (Django's <tt class="docutils literal">runserver</tt> was patched in CVE-2015-0219.) But
under ASGI, there is not the same uniform expectation, even if many proxies
protect against this under default configuration (including <tt class="docutils literal">nginx</tt> via
<tt class="docutils literal">underscores_in_headers off;</tt>).</p>
<p>Headers containing underscores are now ignored by <tt class="docutils literal">ASGIRequest</tt>, matching the
behavior of <tt class="docutils literal">Daphne</tt>, the reference server for ASGI.</p>
<p>This issue has severity &quot;low&quot; according to the Django Security Policy.</p>
<p>Thanks to Tarek Nakkouch for the report.</p>
</div>
<div class="section" id="s-cve-2026-4277-privilege-abuse-in-genericinlinemodeladmin">
<h3>CVE-2026-4277: Privilege abuse in <tt class="docutils literal">GenericInlineModelAdmin</tt></h3>
<p>Add permissions on inline model instances were not validated on submission of
forged <tt class="docutils literal">POST</tt> data in <tt class="docutils literal">GenericInlineModelAdmin</tt>.</p>
<p>This issue has severity &quot;low&quot; according to the Django Security Policy.</p>
<p>Thanks to <a class="reference external" href="mailto:N05ec&#64;LZU-DSLab">N05ec&#64;LZU-DSLab</a> for the report.</p>
</div>
<div class="section" id="s-cve-2026-4292-privilege-abuse-in-modeladmin-list-editable">
<h3>CVE-2026-4292: Privilege abuse in <tt class="docutils literal">ModelAdmin.list_editable</tt></h3>
<p>Admin changelist forms using <tt class="docutils literal">ModelAdmin.list_editable</tt> incorrectly allowed new
instances to be created via forged <tt class="docutils literal">POST</tt> data.</p>
<p>This issue has severity &quot;low&quot; according to the Django Security Policy.</p>
</div>
<div class="section" id="s-cve-2026-33033-potential-denial-of-service-vulnerability-in-multipartparser-via-base64-encoded-file-upload">
<h3>CVE-2026-33033: Potential denial-of-service vulnerability in <tt class="docutils literal">MultiPartParser</tt> via base64-encoded file upload</h3>
<p>When using <tt class="docutils literal">django.http.multipartparser.MultiPartParser</tt>, multipart uploads
with <tt class="docutils literal"><span class="pre">Content-Transfer-Encoding:</span> base64</tt> that include excessive whitespace
may trigger repeated memory copying, potentially degrading performance.</p>
<p>This issue has severity &quot;moderate&quot; according to the Django Security Policy.</p>
<p>Thanks to Seokchan Yoon for the report.</p>
</div>
<div class="section" id="s-cve-2026-33034-potential-denial-of-service-vulnerability-in-asgi-requests-via-memory-upload-limit-bypass">
<h3>CVE-2026-33034: Potential denial-of-service vulnerability in ASGI requests via memory upload limit bypass</h3>
<p>ASGI requests with a missing or understated <tt class="docutils literal"><span class="pre">Content-Length</span></tt> header could
bypass the <tt class="docutils literal">DATA_UPLOAD_MAX_MEMORY_SIZE</tt> limit when reading
<tt class="docutils literal">HttpRequest.body</tt>, potentially loading an unbounded request body into
memory and causing service degradation.</p>
<p>This issue has severity &quot;low&quot; according to the Django Security Policy.</p>
<p>Thanks to Superior for the report.</p>
</div>
<div class="section" id="s-affected-supported-versions">
<h3>Affected supported versions</h3>
<ul class="simple">
<li>Django main</li>
<li>Django 6.0</li>
<li>Django 5.2</li>
<li>Django 4.2</li>
</ul>
</div>
<div class="section" id="s-resolution">
<h3>Resolution</h3>
<p>Patches to resolve the issue have been applied to Django's
main, 6.0, 5.2, and 4.2 branches.
The patches may be obtained from the following changesets.</p>
<div class="section" id="s-cve-2026-3902-asgi-header-spoofing-via-underscore-hyphen-conflation-1">
<h4>CVE-2026-3902: ASGI header spoofing via underscore/hyphen conflation</h4>
<ul class="simple">
<li>On the <a class="reference external" href="https://github.com/django/django/commit/caf90a971f09323775ed0cacf94eadaf39d040e0">main branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/a623c3982857e80324448f85c7faf9a6710330ef">6.0 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/1cc2a7612f97c109b92415fc11ba9bd0501852e0">5.2 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/4412731aa64d62a6dd7edae79e0c15b72666d7ca">4.2 branch</a></li>
</ul>
</div>
<div class="section" id="s-cve-2026-4277-privilege-abuse-in-genericinlinemodeladmin-1">
<h4>CVE-2026-4277: Privilege abuse in <tt class="docutils literal">GenericInlineModelAdmin</tt></h4>
<ul class="simple">
<li>On the <a class="reference external" href="https://github.com/django/django/commit/ef8b25dcc06d158683a5623ce406d561638f4073">main branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/08a752c1cd8f378b4c64d96c319da23726df6ed3">6.0 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/60ffa957c427e10a2eb0fc80d1674a8a8ccc30b0">5.2 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/051f3909e820360bbe84a21350e82f4961e3d917">4.2 branch</a></li>
</ul>
</div>
<div class="section" id="s-cve-2026-4292-privilege-abuse-in-modeladmin-list-editable-1">
<h4>CVE-2026-4292: Privilege abuse in <tt class="docutils literal">ModelAdmin.list_editable</tt></h4>
<ul class="simple">
<li>On the <a class="reference external" href="https://github.com/django/django/commit/6afe7ce93964f56e33a29d477c269436f9b60cbf">main branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/428c48f358c5a0ed5ca2834fb721d615eb2b0e11">6.0 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/397c22048244db2cd4bb78f570e6c72a3967bf36">5.2 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/abfe1a1c57a57cfaf6dd4a0571c029401a0fe743">4.2 branch</a></li>
</ul>
</div>
<div class="section" id="s-cve-2026-33033-potential-denial-of-service-vulnerability-in-multipartparser-via-base64-encoded-file-upload-1">
<h4>CVE-2026-33033: Potential denial-of-service vulnerability in <tt class="docutils literal">MultiPartParser</tt> via base64-encoded file upload</h4>
<ul class="simple">
<li>On the <a class="reference external" href="https://github.com/django/django/commit/7e9885f99cee771b51692fadc5592bdbf19641aa">main branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/0910af60468216c856dfbcac1177372c225deb76">6.0 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/0b467893bdde69a2d23034338e76021a1e4f4322">5.2 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/f13c20f81b56108ac477213fa5ada2524b5e5c98">4.2 branch</a></li>
</ul>
</div>
<div class="section" id="s-cve-2026-33034-potential-denial-of-service-vulnerability-in-asgi-requests-via-memory-upload-limit-bypass-1">
<h4>CVE-2026-33034: Potential denial-of-service vulnerability in ASGI requests via memory upload limit bypass</h4>
<ul class="simple">
<li>On the <a class="reference external" href="https://github.com/django/django/commit/953c238058c0ce387a1a41cb491bfc1875d73ad0">main branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/393dbc53e848876fdba92fbf02e10ee6a6eace6b">6.0 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/49e1e2b548999a35a025f9682598946bda9e9921">5.2 branch</a></li>
<li>On the <a class="reference external" href="https://github.com/django/django/commit/ed4dfda62718a0bb644b80ac8b1d3099861f2295">4.2 branch</a></li>
</ul>
</div>
</div>
<div class="section" id="s-the-following-releases-have-been-issued">
<h3>The following releases have been issued</h3>
<ul class="simple">
<li>Django 6.0.4 (<a class="reference external" href="https://www.djangoproject.com/download/6.0.4/tarball/">download Django 6.0.4</a> |
<a class="reference external" href="https://www.djangoproject.com/download/6.0.4/checksum/">6.0.4 checksums</a>)</li>
<li>Django 5.2.13 (<a class="reference external" href="https://www.djangoproject.com/download/5.2.13/tarball/">download Django 5.2.13</a> |
<a class="reference external" href="https://www.djangoproject.com/download/5.2.13/checksum/">5.2.13 checksums</a>)</li>
<li>Django 4.2.30 (<a class="reference external" href="https://www.djangoproject.com/download/4.2.30/tarball/">download Django 4.2.30</a> |
<a class="reference external" href="https://www.djangoproject.com/download/4.2.30/checksum/">4.2.30 checksums</a>)</li>
</ul>
<p>The PGP key ID used for this release is Jacob Walls: <a class="reference external" href="https://github.com/jacobtylerwalls.gpg">131403F4D16D8DC7</a></p>
</div>
<div class="section" id="s-general-notes-regarding-security-reporting">
<h3>General notes regarding security reporting</h3>
<p>As always, we ask that potential security issues be reported via private email
to <tt class="docutils literal">security&#64;djangoproject.com</tt>, and not via Django's Trac instance, nor via
the Django Forum. Please see <a class="reference external" href="https://www.djangoproject.com/security/">our security policies</a> for further information.</p>
</div></content:encoded>
	
	<dc:date>2026-04-07T14:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://realpython.com/courses/using-loguru-to-simplify-python-logging/">
	<title>Real Python: Using Loguru to Simplify Python Logging</title>
	<link>https://realpython.com/courses/using-loguru-to-simplify-python-logging/</link>
	
	<content:encoded><p>Logging is a vital programming practice that helps you track, understand, and debug your application&rsquo;s behavior. Loguru is a Python library that provides simpler, more intuitive logging compared to Python&rsquo;s built-in <code>logging</code> module.</p>
<p>Good logging gives you insights into your program&rsquo;s execution, helps you diagnose issues, and provides valuable information about your application&rsquo;s health in production. Without proper logging, you risk missing critical errors, spending countless hours <a href="https://realpython.com/python-debugging-pdb/">debugging</a> blind spots, and potentially undermining your project&rsquo;s overall stability.</p>
<p><strong>By the end of this video course, you&rsquo;ll understand that:</strong></p>
<ul>
<li><strong>Logging</strong> in Python can be <strong>simple and intuitive</strong> with the right tools.</li>
<li>Using Loguru lets you <strong>start logging immediately</strong> without complex configuration.</li>
<li>You can <strong>customize log formats</strong> and send logs to multiple destinations like files, the standard error stream, or external services.</li>
<li>Loguru provides <strong>powerful debugging capabilities</strong> that make troubleshooting easier.</li>
<li>Loguru supports <strong>structured logging</strong> with JSON formatting for modern applications.</li>
</ul>
<p>After watching this course, you&rsquo;ll be able to quickly implement better logging in your Python applications. You&rsquo;ll spend less time wrestling with logging configuration and more time using logs effectively to debug issues. This will help you build production-ready applications that are easier to troubleshoot when problems occur.</p>
<p>To get the most from this course, you should be familiar with Python concepts like <a href="https://realpython.com/defining-your-own-python-function/">functions</a>, <a href="https://realpython.com/primer-on-python-decorators/">decorators</a>, and <a href="https://realpython.com/python-with-statement/">context managers</a>. You might also find it helpful to have some experience with Python&rsquo;s built-in <a href="https://realpython.com/python-logging/"><code>logging</code></a> module, though this isn&rsquo;t required.</p>
<p>Don&rsquo;t worry if you&rsquo;re new to logging in Python. This course will guide you through everything you need to know to get started with Loguru and implement effective logging in your applications.</p>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-07T14:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://www.djangoproject.com/weblog/2026/apr/07/could-you-host-djangocon-europe-2027-call-for-orga/">
	<title>Django Weblog: Could you host DjangoCon Europe 2027? Call for organizers</title>
	<link>https://www.djangoproject.com/weblog/2026/apr/07/could-you-host-djangocon-europe-2027-call-for-orga/</link>
	
	<content:encoded><p>We are looking for the next group of organizers to own and lead the 2027 DjangoCon Europe conference. Could your town's football stadium, theatre, cinema, city hall, circus tent or a private island host this wonderful community event?</p>
<p>DjangoCon Europe is a major pillar of the Django community, as people from across the world meet and share. Many qualities make it a unique event: Unconventional and conventional venues, creative happenings, a feast of talks and a dedication to inclusion and diversity.</p>
<p>Hosting a DjangoCon is an ambitious undertaking. It's hard work, but each year it has been successfully run by a team of community volunteers, not all of whom have had previous experience - more important is enthusiasm, organizational skills, the ability to plan and manage budgets, time and people - and plenty of time to invest in the project.</p>
<p>For 2027, rest assured that we will be there to answer questions and put you in touch with previous organizers through the brand new <a href="https://github.com/django/dsf-working-groups/blob/main/active/events-support.md">DSF Events Support Working Group</a> (a reboot of the previous DjangoCon Europe Support Working Group).</p>
<h4 id="s-step-1-submit-your-expression-of-interest">Step 1: Submit your expression of interest</h4>
<p>If you're considering organizing DjangoCon Europe (🙌 great!), fill in our <a href="https://docs.google.com/forms/d/e/1FAIpQLSc4OuhWG2DRsWSH_S1M313_RrdHdi9ozBWl0rtDAsvlRospCw/viewform">DjangoCon Europe 2027 expression of interest form</a> with your contact details. No need to fill in all the information at this stage if you don't have it all already, we'll reach out and help you figure it out.</p>
<p><a href="https://docs.google.com/forms/d/e/1FAIpQLSc4OuhWG2DRsWSH_S1M313_RrdHdi9ozBWl0rtDAsvlRospCw/viewform">Express your interest in organizing</a></p>
<h4 id="s-step-2-were-here-to-help">Step 2: We're here to help!</h4>
<p>We've set up a <a href="https://github.com/django/dsf-working-groups/blob/main/active/events-support.md">DjangoCon Europe support working group</a> of previous organizers that you can reach out to with questions about organizing and running a DjangoCon Europe.</p>
<p>The group will be in touch with everyone submitting the expression of interest form, or you can reach out to them directly: events-support@djangoproject.com</p>
<p>We'd love to hear from you as soon as possible, so your proposal can be finalized and sent to the DSF board by June 1st 2026.</p>
<h4 id="s-step-3-submitting-the-proposal">Step 3: Submitting the proposal</h4>
<p>The more detailed and complete your final proposal is, the better. Basic details include:</p>
<ul>
<li>Organizing committee members: You won't have a full team yet, probably, naming just some core team members is enough.</li>
<li>The legal entity that is intended to run the conference: Even if the entity does not exist yet, please share how you are planning to set it up.</li>
<li>Dates: See "What dates are possible in 2027?" below. We must avoid conflicts with major holidays, EuroPython, DjangoCon US, and PyCon US.</li>
<li>Venue(s), including size, number of possible attendees, pictures, accessibility concerns, catering, etc.</li>
<li>Transport links and accommodation: Can your venue be reached by international travelers?</li>
<li>Budgets and ticket prices: Talk to the DjangoCon Europe Support group to get help with this, including information on past event budgets.</li>
</ul>
<p>We also like to see:</p>
<ul>
<li>Timelines</li>
<li>Pictures</li>
<li>Plans for online participation, and other ways to make the event more inclusive and reduce its environmental footprint</li>
<li>Draft agreements with providers</li>
<li>Alternatives you have considered</li>
</ul>
<p>Have a look at our proposed (draft, feedback welcome) <a href="https://docs.google.com/document/d/1pxx8Zzu9CJz-rCtZyLPVe6FtdOKrzwH_tDyw2wpVOCA/edit?usp=sharing">DjangoCon Europe 2027 Licensing Agreement</a> for the fine print on contractual requirements and involvement of the Django Software Foundation.</p>
<p>Submit your completed proposal by June 1st 2026 via our <a href="https://docs.google.com/forms/d/e/1FAIpQLSc4OuhWG2DRsWSH_S1M313_RrdHdi9ozBWl0rtDAsvlRospCw/viewform">DjangoCon Europe 2027 expression of interest form</a>, this time filling in as many fields as possible. We look forward to reviewing great proposals that continue the excellence the whole community associates with DjangoCon Europe.</p>
<h4 id="s-qa">Q&amp;A</h4>
<h5 id="s-can-i-organize-a-conference-alone">Can I organize a conference alone?</h5>
<p>We strongly recommend that a team of people submit an application.</p>
<h5 id="s-iwe-dont-have-a-legal-entity-yet-is-that-a-problem">I/we don't have a legal entity yet, is that a problem?</h5>
<p>Depending on your jurisdiction, this is usually not a problem. But please share your plans about the entity you will use or form in your application.</p>
<h5 id="s-do-iwe-need-experience-with-organizing-conferences">Do I/we need experience with organizing conferences?</h5>
<p>The support group is here to help you succeed. From experience, we know that many core groups of 2-3 people have been able to run a DjangoCon with guidance from previous organizers and help from volunteers.</p>
<h5 id="s-what-is-required-in-order-to-announce-an-event">What is required in order to announce an event?</h5>
<p>Ultimately, a contract with the venue confirming the dates is crucial, since announcing a conference makes people book calendars, holidays, buy transportation and accommodation etc. This, however, would only be relevant after the DSF board has concluded the application process. Naturally, the application itself cannot contain any guarantees, but it's good to check concrete dates with your venues to ensure they are actually open and currently available, before suggesting these dates in the application.</p>
<h5 id="s-do-we-have-to-do-everything-ourselves">Do we have to do everything ourselves?</h5>
<p>No. You will definitely be offered lots of help by the community. Typically, conference organizers will divide responsibilities into different teams, making it possible for more volunteers to join. Local organizers are free to choose which areas they want to invite the community to help out with, and a call will go out through a blog post announcement on djangoproject.com and social media.</p>
<h5 id="s-what-kind-of-support-can-we-expect-from-the-django-software-foundation">What kind of support can we expect from the Django Software Foundation?</h5>
<p>The DSF regularly provides grant funding to DjangoCon organizers, to the extent of $6,000 in recent editions. We also offer support via specific working groups:</p>
<ul>
<li>The dedicated <a href="https://github.com/django/dsf-working-groups/blob/main/active/dceu.md">DjangoCon Europe support working group</a>.</li>
<li>The <a href="https://github.com/django/dsf-working-groups/blob/main/active/social-media.md">social media working group</a> can help you promote the event.</li>
<li>The <a href="https://github.com/django/dsf-working-groups/blob/main/active/code-of-conduct.md">Code of Conduct working group</a> works with all event organizers.</li>
</ul>
<p>In addition, a lot of <a href="https://www.djangoproject.com/foundation/individual-members/">Individual Members</a> of the DSF regularly volunteer at community events. If your team aren't Individual Members, we can reach out to them on your behalf to find volunteers.</p>
<h5 id="s-what-dates-are-possible-in-2027">What dates are possible in 2027?</h5>
<p>For 2027, DjangoCon Europe should happen between January 4th and April 26th, or June 3rd and June 27th. This is to avoid the following community events' provisional dates:</p>
<ul>
<li>PyCon US 2027: May 2027</li>
<li>EuroPython 2027: July 2027</li>
<li>DjangoCon US 2027: September - October 2027</li>
<li>DjangoCon Africa 2027: August - September 2027</li>
</ul>
<p>We also want to avoid the following holidays:</p>
<ul>
<li>New Year's Day: Friday 1st January 2027</li>
<li>Chinese New Year: Saturday 6th February 2027</li>
<li>Eid Al-Fitr: Tuesday 9th March 2027</li>
<li>Easter: Sunday 28th March 2027</li>
<li>Passover: Wednesday 21st - Thursday 29th April 2027</li>
<li>Eid Al-Adha: Monday 17th - Thursday 20th May 2027</li>
<li>Rosh Hashanah: Saturday 2nd - Monday 4th October 2027</li>
<li>Yom Kippur: Monday 11th - Tuesday 12th October 2027</li>
</ul>
<h5 id="s-what-cities-or-countries-are-possible">What cities or countries are possible?</h5>
<p>Any city in Europe. This can be a city or country where DjangoCon Europe has happened in the past (Athens, Vigo, Edinburgh, Porto, Copenhagen, Heidelberg, Florence, Budapest, Cardiff, Toulon, Warsaw, Zurich, Amsterdam, Berlin), or a new locale.</p>
<h4 id="s-references">References</h4>
<h5 id="s-past-calls">Past calls</h5>
<ul>
<li><a href="https://www.djangoproject.com/weblog/2015/may/18/interested-organizing-djangocon-europe-2016/">Interested in organizing DjangoCon Europe 2016? | Weblog | Django</a></li>
<li><a href="https://www.djangoproject.com/weblog/2016/mar/04/host-djangocon-europe-2017/">Could you host DjangoCon Europe 2017? | Weblog | Django</a></li>
<li><a href="https://www.djangoproject.com/weblog/2018/may/10/djangocon-europe-2019-where-will-it-be/">DjangoCon Europe 2019 - where will it be? | Weblog | Django</a></li>
<li><a href="https://www.djangoproject.com/weblog/2022/feb/03/could-you-host-djangocon-europe-2023/">Could you host DjangoCon Europe 2023? | Weblog | Django</a></li>
<li><a href="https://www.djangoproject.com/weblog/2022/jun/12/last-chance-for-a-djangocon-europe-2023/">Last Chance for a DjangoCon Europe 2023 | Weblog | Django</a></li>
<li><a href="https://www.djangoproject.com/weblog/2023/mar/20/want-to-host-djangocon-europe-2024/">Want to host DjangoCon Europe 2024? | Weblog | Django</a></li>
<li><a href="https://www.djangoproject.com/weblog/2024/jan/15/djangocon-europe-2025-call-for-proposals/">DjangoCon Europe 2025 Call for Proposals | Weblog | Django</a></li>
<li><a href="https://www.djangoproject.com/weblog/2024/may/05/last-call-djangocon-europe-2025-organizers/">Last call for DjangoCon Europe 2025 organizers | Weblog | Django</a></li>
<li><a href="https://www.djangoproject.com/weblog/2024/aug/28/could-you-host-djangocon-europe-2026-cfp/">Could you host DjangoCon Europe 2026? Call for organizers | Weblog | Django</a></li>
</ul></content:encoded>
	
	<dc:date>2026-04-07T13:06:33+00:00</dc:date>
	
</item>

<item rdf:about="https://realpython.com/quizzes/building-gui-application-tkinter/">
	<title>Real Python: Quiz: Building a Python GUI Application With Tkinter</title>
	<link>https://realpython.com/quizzes/building-gui-application-tkinter/</link>
	
	<content:encoded><p>In this quiz, you&rsquo;ll test your understanding of
<a href="https://realpython.com/courses/building-gui-application-tkinter/">Building a Python GUI Application With Tkinter</a>.</p>
<p>Test your Tkinter knowledge by identifying core widgets, managing layouts, handling text with <code>Entry</code> and <code>Text</code> widgets, and connecting buttons to Python functions.</p>
<p>This quiz also covers event loops, widget sizing, and file dialogs, helping you solidify the essentials for building interactive, cross-platform Python GUI apps.</p>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-07T12:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://realpython.com/quizzes/using-loguru-to-simplify-python-logging/">
	<title>Real Python: Quiz: Using Loguru to Simplify Python Logging</title>
	<link>https://realpython.com/quizzes/using-loguru-to-simplify-python-logging/</link>
	
	<content:encoded><p>In this quiz, you&rsquo;ll test your understanding of <a href="https://realpython.com/courses/using-loguru-to-simplify-python-logging/">Using Loguru to Simplify Python Logging</a>.</p>
<p>By working through this quiz, you&rsquo;ll revisit key concepts like the pre-configured logger, log levels, format placeholders, adding context with <code>.bind()</code> and <code>.contextualize()</code>, and saving logs to files.</p>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-07T12:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://blog.jetbrains.com/pycharm/2026/04/how-to-train-your-first-tensorflow-model/">
	<title>PyCharm: How to Train Your First TensorFlow Model in PyCharm</title>
	<link>https://blog.jetbrains.com/pycharm/2026/04/how-to-train-your-first-tensorflow-model/</link>
	
	<content:encoded><p><em>This is a guest post from </em><strong><em><a href="https://blog.jetbrains.com/pycharm/2026/04/how-to-train-your-first-tensorflow-model/#author">Iulia Feroli</a></em></strong><em>, founder of the Back To Engineering community on YouTube.</em></p>



<figure class="wp-block-image size-full"><img alt="How to Train Your First TensorFlow Model in PyCharm" class="wp-image-697465" src="https://blog.jetbrains.com/wp-content/uploads/2026/04/PC-social-BlogFeatured-1280x720-1-1.png" style="width: 100% !important; height: auto !important;" /></figure>



<p><a href="https://www.tensorflow.org/" rel="noopener" target="_blank">TensorFlow</a> is a powerful open-source framework for building machine learning and deep learning systems. At its core, it works with tensors (a.k.a multi‑dimensional arrays) and provides high‑level libraries (like Keras) that make it easy to transform raw data into models you can train, evaluate, and deploy.</p>



<p>TensorFlow helps you handle the full pipeline: loading and preprocessing data, assembling models from layers and activations, training with optimizers and loss functions, and exporting for serving or even running on edge devices (including lightweight TensorFlow Lite models on Raspberry Pi and other microcontrollers).&nbsp;</p>



<p>If you want to make data-driven applications, prototyping neural networks, or ship models to production or devices, learning TensorFlow gives you a consistent, well-supported toolkit to go from idea to deployment.</p>



<p>If you’re brand new to TensorFlow, start by watching the <strong><a href="https://www.youtube.com/watch?v=hm07b8ETaso" rel="noopener" target="_blank">short overview video</a></strong> where I explain tensors, neural networks, layers, and why TensorFlow is great for taking data → model → deployment, and how all of this can be explained with a LEGO-style pieces sorting example.&nbsp;</p>



<p>In this blog post, I’ll walk you through a first, stripped-down TensorFlow implementation notebook so we can get started with some practical experience. You can also watch the walkthrough video to follow along.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>We&#8217;ll be exploring a very simple use case today: load the Fashion MNIST dataset, build two very simple Keras models, train and compare them, then dig into visualizations (predictions, confidence bars, confusion matrix). I kept the code minimal and readable so you can focus on the ideas – and you’ll see how <a href="https://www.jetbrains.com/pycharm/data-science/" rel="noopener" target="_blank">PyCharm</a> helps along the way.</p>



<h2 class="wp-block-heading">Training TensorFlow models step by step</h2>



<h3 class="wp-block-heading">Getting started in PyCharm</h3>



<p>We&#8217;ll be leveraging PyCharm&#8217;s native Notebook integration to build out <a href="https://github.com/iuliaferoli/TensorFlow_with_pycharm" rel="noopener" target="_blank">our project</a>. This way, we can inspect each step of the pipeline and use some supporting visualization along the way. We&#8217;ll <a href="https://www.jetbrains.com/help/pycharm/creating-empty-project.html" rel="noopener" target="_blank">create a new project</a> and <a href="https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html" rel="noopener" target="_blank">generate a virtual environment</a> to manage our dependencies.&nbsp;</p>



<p>If you&#8217;re running the code from the attached repo, you can install directly from the requirements file. If you wish to expand this example with additional visualizations for further models, you can easily add more packages to your requirements as you go by using the PyCharm package manager helpers for <a href="https://www.jetbrains.com/guide/python/tips/install-and-import/)%20and" rel="noopener" target="_blank">installing</a> and <a href="https://www.jetbrains.com/help/pycharm/installing-uninstalling-and-upgrading-packages.html" rel="noopener" target="_blank">upgrading</a>.</p>



<h3 class="wp-block-heading">Load <code>Fashion MNIST</code> and inspect the data</h3>



<p><code>Fashion MNIST</code> is a great starter because the images are small (28×28 pixels), visually meaningful, and easy to interpret. They represent various garment types as pixelated black-and-white images, and provide the relevant labels for a well-contained classification task. We can first take a look at our data sample by printing some of these images with various matplotlib functions:</p>



<figure class="wp-block-image size-full"><img alt="Load Fashion MNIST and inspect the data" class="wp-image-697487" src="https://blog.jetbrains.com/wp-content/uploads/2026/04/image-4.png" style="width: 100% !important; height: auto !important;" /></figure>



<pre class="EnlighterJSRAW">```
fig, axes = plt.subplots(2, 5, figsize=(10, 4))
for i, ax in enumerate(axes.flat):
    ax.imshow(x_train[i], cmap='gray')
    ax.set_title(class_names[y_train[i]])
    ax.axis('off')
plt.show()
```
# Two simple models (a quick experiment)
```
model1 = models.Sequential([
    layers.Flatten(input_shape=(28, 28)),
    layers.Dense(128, activation='relu'),
    layers.Dense(10, activation='softmax')
])
model2 = models.Sequential([
    layers.Flatten(input_shape=(28, 28)),
    layers.Dense(128, activation='relu'),
    layers.Dense(128, activation='relu'),
    layers.Dense(10, activation='softmax')
])
```</pre>



<h3 class="wp-block-heading">Compile and train your first model</h3>



<p>From here, we can compile and train our first TensorFlow model(s). With PyCharm’s code completion features and documentation access, you can get instant suggestions for building out these simple code blocks.</p>



<p>For a first try at TensorFlow, this allows us to spin up a working model with just a few presses of <em>Tab</em> in our IDE. We&#8217;re using the recommended standard optimizer and loss function, and we&#8217;re tracking for accuracy. We can choose to build multiple models by playing around with the number or type of layers, along with the other parameters.&nbsp;</p>



<pre class="EnlighterJSRAW">```
model1.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)
model1.fit(x_train, y_train, epochs=10)
model2.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)
model2.fit(x_train, y_train, epochs=15)
```</pre>



<h3 class="wp-block-heading">Evaluate and compare your TensorFlow model performance</h3>



<pre class="EnlighterJSRAW">```
loss1, accuracy1 = model1.evaluate(x_test, y_test)
print(f'Accuracy of model1: {accuracy1:.2f}')
loss2, accuracy2 = model2.evaluate(x_test, y_test)
print(f'Accuracy of model2: {accuracy2:.2f}')
```</pre>



<p>Once the models are trained (and you can see the epochs progressing visually as each cell is run), we can immediately evaluate the performance of the models.</p>



<p>In my experiment, <code>model1</code> sits around ~0.88 accuracy, and while <code>model2</code> is a little higher than that, it took 50% longer to train. That’s the kind of trade‑off you should be thinking about: Is a tiny accuracy gain worth the additional compute and complexity?&nbsp;</p>



<p>We can dive further into the results of the model run by generating a DataFrame instance of our new prediction dataset. Here we can also leverage built-in functions like `describe` to quickly get some initial statistical impressions:</p>



<figure class="wp-block-image size-full"><img alt="Evaluate and compare your TensorFlow model performance" class="wp-image-697490" src="https://blog.jetbrains.com/wp-content/uploads/2026/04/image-4.png" style="width: 100% !important; height: auto !important;" /></figure>



<pre class="EnlighterJSRAW">```
predictions = model1.predict(x_test)
import pandas as pd
df_pred = pd.DataFrame(predictions, columns=class_names)
df_pred.describe()
```</pre>



<p>However, the most useful statistics will compare our model&#8217;s prediction with the ground truth &#8220;real&#8221; labels of our dataset. We can also break this down by item category:</p>



<pre class="EnlighterJSRAW">```
y_pred = model1.predict(x_test).argmax(axis=1)
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8,6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, yticklabels=class_names)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
print('Classification report:')
print(classification_report(y_test, y_pred, target_names=class_names))
```</pre>



<p>From here, we can notice that the accuracy differs quite a bit by type of garment. A possible interpretation of this is that trousers are quite a distinct type of clothing from, say, t-shirts and shirts, which can be more commonly confused.&nbsp;</p>



<p>This is, of course, the type of nuance that, as humans, we can pick up by looking at the images, but the model only has access to a matrix of pixel values. The data does seem, however, to confirm our intuition. We can further build a more comprehensive visualization to test this hypothesis.&nbsp;</p>



<figure class="wp-block-image size-full"><img alt="" class="wp-image-697493" src="https://blog.jetbrains.com/wp-content/uploads/2026/04/image-4.png" style="width: 100% !important; height: auto !important;" /></figure>



<pre class="EnlighterJSRAW">```
import numpy as np
import matplotlib.pyplot as plt
# pick 8 wrong examples
y_pred = predictions.argmax(axis=1)
wrong_idx = np.where(y_pred != y_test)[0][:8]  # first 8 mistakes
n = len(wrong_idx)
fig, axes = plt.subplots(n, 2, figsize=(10, 2.2 * n), constrained_layout=True)
for row, idx in enumerate(wrong_idx):
    p = predictions[idx]
    pred = int(np.argmax(p))
    true = int(y_test[idx])
    axes[row, 0].imshow(x_test[idx], cmap="gray")
    axes[row, 0].axis("off")
    axes[row, 0].set_title(
        f"WRONG  P:{class_names[pred]} ({p[pred]:.2f})  T:{class_names[true]}",
        color="red",
        fontsize=10
    )
    bars = axes[row, 1].bar(range(len(class_names)), p, color="lightgray")
    bars[pred].set_color("red")
    axes[row, 1].set_ylim(0, 1)
    axes[row, 1].set_xticks(range(len(class_names)))
    axes[row, 1].set_xticklabels(class_names, rotation=90, fontsize=8)
    axes[row, 1].set_ylabel("conf", fontsize=9)
plt.show()
```</pre>



<p>This table generates a view where we can explore the confidence our model had in a prediction: By exploring which weight each class was given, we can see where there was doubt (i.e. multiple classes with a higher weight) versus when the model was certain (only one guess). These examples further confirm our intuition: top-types appear to be more commonly confused by the model.&nbsp;</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>And there we have it! We were able to set up and train our first model and already drive some data science insights from our data and model results. Using some of the PyCharm functionalities at this point can speed up the experimentation process by providing access to our documentation and applying code completion directly in the cells. We can even use AI Assistant to help generate some of the graphs we&#8217;ll need to further evaluate the TensorFlow model performance and investigate our results.</p>



<p>You can <a href="https://github.com/iuliaferoli/TensorFlow_with_pycharm" rel="noopener" target="_blank">try out this notebook yourself</a>, or better yet, try to generate it with these same tools for a more hands-on learning experience.</p>



<h2 class="wp-block-heading">Where to go next</h2>



<p><a href="https://github.com/iuliaferoli/TensorFlow_with_pycharm" rel="noopener" target="_blank">This notebook</a> is a minimal, teachable starting point. Here are some practical next steps to try afterwards:</p>



<ul>
<li>Replace the dense baseline with a small CNN (Conv2D → MaxPooling → Dense).</li>



<li>Add dropout or batch normalization to reduce overfitting.</li>



<li>Apply data augmentation (random shifts/rotations) to improve generalization.</li>



<li>Use callbacks like <code>EarlyStopping</code> and <code>ModelCheckpoint</code> so training is efficient, and you keep the best weights.</li>



<li>Export a <code>SavedModel</code> for server use or convert to TensorFlow Lite for edge devices (Raspberry Pi, microcontrollers).</li>
</ul>



<h2 class="wp-block-heading">Frequently asked questions</h2>



<h3 class="wp-block-heading">When should I use TensorFlow?</h3>



<p>TensorFlow is best used when building machine learning or deep learning models that need to scale, go into production, or run across different environments (cloud, mobile, edge devices).&nbsp;</p>



<p>TensorFlow is particularly well-suited for large-scale models and neural networks, including scenarios where you need strong deployment support (TensorFlow Serving, TensorFlow Lite). For research prototypes, TensorFlow is viable, but it’s more commonplace to use lightweight frameworks for easier experimentation.</p>



<h3 class="wp-block-heading">Can TensorFlow run on a GPU?</h3>



<p>Yes, TensorFlow can run GPUs and TPUs. Additionally, using a GPU can significantly speed up training, especially for deep learning models with large datasets. The best part is, TensorFlow will automatically use an available GPU if it’s properly configured.</p>



<h3 class="wp-block-heading">What is loss in TensorFlow?</h3>



<p>Loss (otherwise known as loss function) measures how far a model’s predictions are from the actual target values. Loss in TensorFlow is a numerical value representing the distance between predictions and actual target values. A few examples include:&nbsp;</p>



<ul>
<li>MSE (mean squared error), used in regression tasks.</li>



<li>Cross-entropy loss, often used in classification tasks.</li>
</ul>



<h3 class="wp-block-heading">How many epochs should I use?</h3>



<p>There’s no set number of epochs to use, as it depends on your dataset and model. Typical approaches cover:&nbsp;</p>



<ul>
<li>Starting with a conservative number (10–50 epochs).</li>



<li>Monitoring validation loss/accuracy and adjusting based on the results you see.</li>



<li>Using early stopping to halt training when improvements decrease.</li>
</ul>



<p>An epoch is one full pass through your training data. Not enough passes through leads to underfitting, and too many can cause overfitting. The sweet spot is where your model generalizes best to unseen data.&nbsp;</p>



<h2 class="wp-block-heading" id="author">About the author</h2>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img alt="" src="https://blog.jetbrains.com/wp-content/uploads/2026/04/Iulia-Feroli-e1775558363746.png" style="width: 100% !important; height: auto !important;" />
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Iulia Feroli</h4>
                                                <p><span style="font-weight: 400;">Iulia’s mission is to make tech exciting, understandable, and accessible to the new generation.</span></p>
<p><span style="font-weight: 400;">With a background spanning data science, AI, cloud architecture, and open source, she brings a unique perspective on bridging technical depth with approachability.</span></p>
<p><span style="font-weight: 400;">She’s building her own brand, Back To Engineering, through which she creates a community for tech enthusiasts, engineers, and makers. From YouTube videos on building robots from scratch, to conference talks or keynotes about real, grounded AI, and technical blogs and tutorials </span><span style="font-weight: 400;">–</span><span style="font-weight: 400;"> Iulia shares her message worldwide on how to turn complex concepts into tools developers can use every day.</span></p>
                    </div>
                            </div>
        </div>
    </div>



<p></p></content:encoded>
	
	<dc:date>2026-04-07T10:36:35+00:00</dc:date>
	
</item>

<item rdf:about="https://www.listendata.com/2024/05/how-to-use-gemini-in-python.html">
	<title>ListenData: How to Use Gemini API in Python</title>
	<link>https://www.listendata.com/2024/05/how-to-use-gemini-in-python.html</link>
	
	<content:encoded><img alt="Integrating Gemini API with Python" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv7fZDMJQnSKigSmu3bT10rNbDFCUCJjE9vZjSa2Ad0ri3E_9NyEXs32sIu_pvxx77-7ffmAOLbQW9Ip601KaPAPIdpoyXjwKHoQyI0p4uDnY0OEnzOf3W_t600pIt1qyVjD5pNOh0bfzrvHYKpnJ_D3jOQ_QFvd9UIdeGPjgVasQfM3Wt_NisHpE29f4-/s1600/Gemini_API.png" />
<p>In this tutorial, you will learn how to use Google's Gemini AI model through its API in Python.</p>
<div class="note"><b>Updated (<time datetime="2026-04-03">April 3, 2026</time>):</b> This tutorial has been updated for the latest Gemini models, including <b>Gemini 3.1 Flash</b> and <b>Gemini 3.1 Pro</b>. It now supports real-time search, multimodal generation, and the latest Flash/Pro model aliases such as <b>gemini-flash-latest</b> and <b>gemini-pro-latest</b>.</div>

<div class="db">Steps to Access Gemini API</div>
<p>Follow the steps below to access the Gemini API and then use it in python.</p>
<ol>
<li>Visit <a href="https://aistudio.google.com/" rel="nofollow" target="_blank">Google AI Studio</a> website.</li>
<li>Sign in using your Google account.</li>
<li>Create an <a href="https://aistudio.google.com/app/apikey" rel="nofollow" target="_blank">API key</a>.</li>
<li>Install the Google AI Python library for the Gemini API using the command below : <br /> <pre>pip install google-genai</pre>.</li>
</ol>
<a href="https://www.listendata.com/2024/05/how-to-use-gemini-in-python.html#more">To read this article in full, please click here</a><div class="blogger-post-footer">This post appeared first on <a href="https://www.listendata.com/">ListenData</a></div></content:encoded>
	
	<dc:date>2026-04-07T01:14:28+00:00</dc:date>
	
</item>

<item rdf:about="https://wirtel.be/post/2026/04/07/livre-python-reconstruction/">
	<title>Stéphane Wirtel: Ce livre Python que je voulais juste mettre à jour</title>
	<link>https://wirtel.be/post/2026/04/07/livre-python-reconstruction/</link>
	
	<content:encoded><h1 id="ce-livre-python-que-je-voulais-juste-mettre-à-jour">Ce livre Python que je voulais juste mettre à jour</h1>
<p>En août dernier, j&rsquo;annonçais la relance de ce livre avec une certaine naïveté : j&rsquo;avais retrouvé mon PDF de 2014, extrait le Markdown avec Docling, et assemblé un pipeline Longform → Pandoc → Typst. Je me disais que ce serait l&rsquo;affaire de quelques semaines — mettre à jour les versions, ajouter quelques chapitres, boucler.</p>
<p>Huit mois plus tard, le périmètre a triplé, la chaîne d&rsquo;outils a été réécrite, et la façon dont je travaille a complètement changé. Ce n&rsquo;est pas ce que j&rsquo;avais prévu. C&rsquo;est mieux.</p></content:encoded>
	
	<dc:date>2026-04-07T00:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://pycon.blogspot.com/2026/04/python-and-future-of-ai-agents.html">
	<title>PyCon: Python and the Future of AI: Agents, Inference, and Edge AI</title>
	<link>https://pycon.blogspot.com/2026/04/python-and-future-of-ai-agents.html</link>
	
	<content:encoded><p><span face="Arial, sans-serif" style="color: #666666; font-size: 15pt;">Finding AI insights and education at PyCon US 2026</span></p><span id="docs-internal-guid-83727840-7fff-7ee9-e255-04ee5f21d4a8"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">While AI content is sprinkled throughout the event, how could it not be, PyCon US features a dedicated </span><a href="https://us.pycon.org/2026/schedule/talks/#May15"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">The Future of AI with Python</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> track, new this year, and programmed by Elaine Wong, PyCon US Chair, Jon Banafato, PyCon US Co-Chair, and Philip Gagnon, Program Committee Chair. According to JetBrains' </span><a href="https://devecosystem-2025.jetbrains.com/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-style: italic; vertical-align: baseline;">State of Developer Ecosystem 2025</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> report, 85% of developers now regularly use AI tools for coding and development (which tell us that you are probably doing that), and 62% rely on at least one AI coding assistant, agent, or code editor.</span><a href="https://blog.jetbrains.com/research/2025/10/state-of-developer-ecosystem-2025/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Looking ahead, nearly half of all developers (49%) plan to try AI coding agents in the coming year,</span><a href="https://blog.jetbrains.com/pycharm/2025/08/the-state-of-python-2025/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">and the eight sessions in this track map onto those priorities, covering everything from running LLMs on your laptop to building real-time voice agents. Take a look at the big themes and the sessions and tutorials you won't want to miss in our new track and throughout the event.&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Let’s start with newbies, if you or someone on your team is just getting started with ML, Corey Wade's Wednesday tutorial</span><a href="https://us.pycon.org/2026/schedule/presentation/3/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Your First Machine Learning Models: How to Build Them in Scikit-learn</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> is the perfect entry point, a hands-on introduction to the building blocks that underpin so much of what's discussed in the talks.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-weight: 400; vertical-align: baseline;">LLMs Are Moving to the Edge</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">One of the most significant shifts in AI right now is the move toward running models locally on laptops, browsers, and devices, rather than in centralized cloud infrastructure. Want to know more? Check out: </span><a href="https://us.pycon.org/2026/schedule/presentation/138/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-style: italic; vertical-align: baseline;">Running Large Language Models on Laptops: Practical Quantization Techniques in Python</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">from</span><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;"> </span><a href="https://us.pycon.org/2026/speaker/profile/146/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Aayush Kumar JVS</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">, a hands-on look at how quantization makes large models practical on consumer hardware. </span><a href="https://us.pycon.org/2026/speaker/profile/136/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Fabio Pliger</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> takes a look at the role of the browser with </span><a href="https://us.pycon.org/2026/schedule/presentation/126/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-style: italic; vertical-align: baseline;">Distributing AI with Python in the Browser: Edge Inference and Flexibility Without Infrastructure</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">, exploring how Python-powered inference can run client-side with no server required. If you've been watching the open-weights model explosion and wondering how to actually deploy these things, these two talks are for you.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Want to go deeper before the conference even starts? On Wednesday, May 13th, </span><a href="https://us.pycon.org/2026/speaker/profile/60/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Isabel Michel</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'s tutorial</span><a href="https://us.pycon.org/2026/schedule/presentation/56/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Implementing RAG in Python: Build a Retrieval-Augmented Generation System</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> gives you hands-on experience building a retrieval-augmented generation pipeline from scratch, the practical foundation underneath a lot of modern LLM applications.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-weight: 400; vertical-align: baseline;">AI Agents and Async Python</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Agentic AI, systems that take multi-step actions autonomously, is one of the defining developments of 2025 and continues to take the world by storm in 2026. But building agents that actually work in production requires getting async right. </span><a href="https://us.pycon.org/2026/speaker/profile/117/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Aditya Mehra</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'s </span><a href="https://us.pycon.org/2026/schedule/presentation/110/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-style: italic; vertical-align: baseline;">Don't Block the Loop: Python Async Patterns for AI Agents</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> digs into the concurrency pitfalls that trip up so many teams when they move from demo to deployment. This talk bridges a gap that many tutorials leave open: the gap between "I have a working agent" and "my agent works reliably at scale."</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">If you want a running start, </span><a href="https://us.pycon.org/2026/speaker/profile/2/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Pamela Fox</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'s Wednesday tutorial</span><a href="https://us.pycon.org/2026/schedule/presentation/2/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Build Your First MCP Server in Python</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> is the perfect on-ramp, MCP (Model Context Protocol) is quickly becoming the standard way to give AI agents access to tools and data, and building one yourself is the fastest way to understand how agentic systems actually work under the hood.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-weight: 400; vertical-align: baseline;">AI and Open Source Sustainability</span></h2><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><a href="https://us.pycon.org/2026/schedule/presentation/105/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-weight: 400; vertical-align: baseline;">AI-Assisted Contributions and Maintainer Load</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 400; vertical-align: baseline;"> by </span><a href="https://us.pycon.org/2026/speaker/profile/111/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-weight: 400; vertical-align: baseline;">Paolo Melchiorre</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 400; vertical-align: baseline;"> tackles a genuinely thorny question: as AI tools make it easier to generate pull requests, what happens to the maintainers on the receiving end? Drawing on real examples from projects like GNOME, OCaml, Python, and Django, Melchiorre examines how AI-generated contributions are shifting workload onto already time-constrained maintainers and what the open source community is doing about it.&nbsp;</span></h2><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-weight: 400; vertical-align: baseline;">High-Performance Inference in Python</span></h2><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 400; vertical-align: baseline;">Python performance engineering is no longer optional for AI workloads. </span><a href="https://us.pycon.org/2026/speaker/profile/129/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-weight: 400; vertical-align: baseline;">Yineng Zhang</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 400; vertical-align: baseline;">'s </span><a href="https://us.pycon.org/2026/schedule/presentation/120/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-style: italic; font-weight: 400; vertical-align: baseline;">High-Performance LLM Inference in Pure Python with PyTorch Custom Ops</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 400; vertical-align: baseline;"> walks through the techniques for squeezing real speed out of inference pipelines without leaving the Python ecosystem (This one isn’t in the track, but it is so on point, I had to add it). Paired with </span><a href="https://us.pycon.org/2026/speaker/profile/85/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-weight: 400; vertical-align: baseline;">Santosh Appachu Devanira Poovaiah</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 400; vertical-align: baseline;">'s </span><a href="https://us.pycon.org/2026/schedule/presentation/81/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-style: italic; font-weight: 400; vertical-align: baseline;">What Python Developers Need to Know About Hardware: A Practical Guide to GPU Memory, Kernel Scheduling, and Execution Models</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-weight: 400; vertical-align: baseline;">, Friday's track offers a practical hardware-to-application view of the performance stack that's increasingly essential for anyone building production AI systems.</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Also, </span><a href="https://us.pycon.org/2026/speaker/profile/112/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Catherine Nelson</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> and </span><a href="https://us.pycon.org/2026/speaker/profile/113/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Robert Masson</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'s Thursday tutorial</span><a href="https://us.pycon.org/2026/schedule/presentation/106/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Going from Notebooks to Production Code</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> is a great complement; bridging the gap between exploratory AI work and the kind of reliable, maintainable code that actually makes it into production systems.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-weight: 400; vertical-align: baseline;">Explainability and Responsible AI</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">As AI systems make more consequential decisions, the demand for explainability is only growing from regulators, from users, and from the developers building these systems. </span><a href="https://us.pycon.org/2026/speaker/profile/72/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Jyoti Yadav</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'s </span><a href="https://us.pycon.org/2026/schedule/presentation/69/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-style: italic; vertical-align: baseline;">Building AI That Explains Itself: Why Your Card Got Declined</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> uses a familiar real-world example to demonstrate how Python developers can build transparency into AI-driven decisions. It's a topic at the heart of current conversations about AI trust, and one that every practitioner should be thinking about.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Two tutorials round this theme out nicely: </span><a href="https://us.pycon.org/2026/speaker/profile/104/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Neha</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'s Wednesday session</span><a href="https://us.pycon.org/2026/schedule/presentation/100/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Causal Inference with Python</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> teaches you how to move beyond correlation and reason about cause and effect in your data, a foundational skill for anyone building AI systems that need to explain </span><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;">why</span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> they made a decision. And on Thursday, </span><a href="https://us.pycon.org/2026/speaker/profile/71/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Juliana Ferreira Alves</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'</span><a href="https://us.pycon.org/2026/schedule/presentation/68/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">When KPIs Go Weird: Anomaly Detection with Python</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> gives you practical tools for catching when your AI-powered systems go off the rails before your users do.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-weight: 400; vertical-align: baseline;">Voice AI and Multimodal Interfaces</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Real-time voice is one of the fastest-moving areas in applied AI, and </span><a href="https://us.pycon.org/2026/speaker/profile/105/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Camila Hinojosa Añez</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> and </span><a href="https://us.pycon.org/2026/speaker/profile/106/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Elizabeth Fuentes</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> close out the AI track Friday evening with </span><a href="https://us.pycon.org/2026/schedule/presentation/101/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-style: italic; vertical-align: baseline;">How to Build Your First Real-Time Voice Agent in Python (Without Losing Your Mind)</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">. This practical session covers the building blocks of voice agents in Python, a skill set that's quickly becoming table stakes for developers building consumer-facing AI products.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-weight: 400; vertical-align: baseline;">AI and Education</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><a href="https://us.pycon.org/2026/speaker/profile/69/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Sonny Mupfuni</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'s</span><a href="https://us.pycon.org/2026/schedule/presentation/66/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">AI-Powered Python Education: Towards Adaptive and Inclusive Learning</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> explores how Python can power learning that adapts to the student, and </span><a href="https://us.pycon.org/2026/speaker/profile/23/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Gift Ojeabulu</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">'s</span><a href="https://us.pycon.org/2026/schedule/presentation/23/"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Making African Languages Visible: A Python-Based Guide to Low-Resource Language ID</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> takes on one of NLP's most persistent blind spots, the languages that dominant datasets routinely leave out. Don't skip these. These sessions represent Python's role not just in building AI products, but in democratizing access to AI's benefits.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">Friday's AI track is a rare chance to hear from practitioners who are building real things in production, not just demoing prototypes. Whether you're a Python developer who's been watching the AI wave from the sidelines or a team already shipping AI features who wants to sharpen your craft, clear your schedule and pull up a chair. And a big THANK YOU to </span><a href="https://www.anaconda.com/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Anaconda</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> and </span><a href="https://developer.nvidia.com/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">NVIDIA</span></a><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;"> </span><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">for sponsoring this track!</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><a href="https://us.pycon.org/2026/attend/information/"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; vertical-align: baseline;">Register for PyCon US 2026</span></a></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; vertical-align: baseline;">We'll see you in Long Beach.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><hr /><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;">PyCon US 2026 takes place May 13–19 in Long Beach, California. The Future of AI with Python talk track runs Friday, May 15th.</span></p><div><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; vertical-align: baseline;"><br /></span></div></span></content:encoded>
	
	<dc:date>2026-04-06T21:36:59+00:00</dc:date>
	
</item>

<item rdf:about="https://treyhunner.com/2026/04/customizing-pdb-with-pdbrc/">
	<title>Trey Hunner: Using a ~/.pdbrc file to customize the Python Debugger</title>
	<link>https://treyhunner.com/2026/04/customizing-pdb-with-pdbrc/</link>
	
	<content:encoded><p>Did you know that you can customize the Python debugger (PDB) by creating custom aliases within a <code>.pdbrc</code> file in your home directory or Python&rsquo;s current working directory?</p>

<p>I recently learned this and I&rsquo;d like to share a few helpful aliases that I now have access to in my PDB sessions thanks to my new <code>~/.pdbrc</code> file.</p>

<h2>The aliases in my <code>~/.pdbrc</code> file</h2>

<p>Here&rsquo;s my new <code>~/.pdbrc</code> file:</p>

<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
</pre></td><td class="code"><pre><code class=""><span class="line"># Custom PDB aliases
</span><span class="line">
</span><span class="line"># dir obj: print non-dunder attributes and methods
</span><span class="line">alias dir print(*(f"%1.{n} = {v!r}" for n, v in __import__('inspect').getmembers(%1) if not n.startswith("__")), sep="\n")
</span><span class="line">
</span><span class="line"># attrs obj: print non-dunder data attributes
</span><span class="line">alias attrs import inspect as __i ;; print(*(f"%1.{n} = {v!r}" for n, v in __i.getmembers(%1, lambda v: not __i.isroutine(v)) if not n.startswith("__")), sep="\n") ;; del __i
</span><span class="line">
</span><span class="line"># vars obj: print instance variables (object must have __dict__)
</span><span class="line">alias vars print(*(f"%1.{k} = {v!r}" for k, v in vars(%1).items()), sep="\n")
</span><span class="line">
</span><span class="line"># src obj: print source file, line number, and code where a class/function was defined
</span><span class="line">alias src import inspect as __i;; print(f"{__i.getsourcefile(%1)} on line {__i.getsourcelines(%1)[1]}:\n{''.join(__i.getsource(%1))}") ;; del __i
</span><span class="line">
</span><span class="line"># loc: print local variables from current frame
</span><span class="line">alias loc print(*(f"{name} = {value!r}" for name, value in vars().items() if not name.startswith("__")), sep="\n")</span></code></pre></td></tr></table></div></figure>


<p>This allows me to use:</p>

<ul>
<li><code>dir</code>, <code>attrs</code>, and <code>vars</code> to inspect Python objects</li>
<li><code>src</code> to see the source code of a particular function/class</li>
<li><code>loc</code> to see the local variables</li>
</ul>


<p>You might wonder &ldquo;Can&rsquo;t I use <code>dir(x)</code> instead of <code>dir x</code> and <code>vars(x)</code> instead of <code>vars x</code> and <code>locals()</code> instead of <code>loc</code>?&rdquo;</p>

<p>You can!&hellip; but those aliases print things out in a nicer format.</p>

<h2>A demo of these 5 aliases</h2>

<p>Let&rsquo;s use <code>-m pdb -m calendar</code> to launch Python&rsquo;s <code>calendar</code> module from the command line while dropping into PDB immediately:</p>

<figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">$ </span>python -m pdb -m calendar
</span><span class="line">&gt; /home/trey/.local/share/uv/python/cpython-3.15.0a3-linux-x86_64-gnu/lib/python3.15/calendar.py<span class="o">(</span>1<span class="o">)</span>&lt;module&gt;<span class="o">()</span>
</span><span class="line">-&gt; <span class="s2">&quot;&quot;</span><span class="err">&quot;</span>Calendar printing functions
</span><span class="line"><span class="o">(</span>Pdb<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then we&rsquo;ll set a breakpoint after lots of stuff has been defined and continue to that breakpoint:</p>

<figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
</pre></td><td class="code"><pre><code class="pycon"><span class="line"><span class="go">(Pdb) b 797</span>
</span><span class="line"><span class="go">Breakpoint 1 at /home/trey/.local/share/uv/python/cpython-3.15.0a3-linux-x86_64-gnu/lib/python3.15/calendar.py:797</span>
</span><span class="line"><span class="go">(Pdb) c</span>
</span><span class="line"><span class="go">&gt; /home/trey/.local/share/uv/python/cpython-3.15.0a3-linux-x86_64-gnu/lib/python3.15/calendar.py(797)&lt;module&gt;()</span>
</span><span class="line"><span class="go">-&gt; firstweekday = c.getfirstweekday</span>
</span><span class="line"><span class="go">(Pdb) l</span>
</span><span class="line"><span class="go">792</span>
</span><span class="line"><span class="go">793</span>
</span><span class="line"><span class="go">794     # Support for old module level interface</span>
</span><span class="line"><span class="go">795     c = TextCalendar()</span>
</span><span class="line"><span class="go">796</span>
</span><span class="line"><span class="go">797 B-&gt; firstweekday = c.getfirstweekday</span>
</span><span class="line"><span class="go">798</span>
</span><span class="line"><span class="go">799     def setfirstweekday(firstweekday):</span>
</span><span class="line"><span class="go">800         if not MONDAY &lt;= firstweekday &lt;= SUNDAY:</span>
</span><span class="line"><span class="go">801             raise IllegalWeekdayError(firstweekday)</span>
</span><span class="line"><span class="go">802         c.firstweekday = firstweekday</span>
</span></code></pre></td></tr></table></div></figure>


<p>The string representation for that <code>c</code> variable doesn&rsquo;t tell us much:</p>

<figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="pycon"><span class="line"><span class="go">(Pdb) !c</span>
</span><span class="line"><span class="go">&lt;__main__.TextCalendar object at 0x7416de93af90&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we use the <code>dir</code> alias, we&rsquo;ll see every attribute that&rsquo;s accessible on <code>c</code> printed in a pretty friendly format:</p>

<figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
</pre></td><td class="code"><pre><code class="pycon"><span class="line"><span class="go">(Pdb) dir c</span>
</span><span class="line"><span class="go">c._firstweekday = 0</span>
</span><span class="line"><span class="go">c.firstweekday = 0</span>
</span><span class="line"><span class="go">c.formatday = &lt;bound method TextCalendar.formatday of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.formatmonth = &lt;bound method TextCalendar.formatmonth of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.formatmonthname = &lt;bound method TextCalendar.formatmonthname of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.formatweek = &lt;bound method TextCalendar.formatweek of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.formatweekday = &lt;bound method TextCalendar.formatweekday of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.formatweekheader = &lt;bound method TextCalendar.formatweekheader of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.formatyear = &lt;bound method TextCalendar.formatyear of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.getfirstweekday = &lt;bound method Calendar.getfirstweekday of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.itermonthdates = &lt;bound method Calendar.itermonthdates of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.itermonthdays = &lt;bound method Calendar.itermonthdays of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.itermonthdays2 = &lt;bound method Calendar.itermonthdays2 of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.itermonthdays3 = &lt;bound method Calendar.itermonthdays3 of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.itermonthdays4 = &lt;bound method Calendar.itermonthdays4 of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.iterweekdays = &lt;bound method Calendar.iterweekdays of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.monthdatescalendar = &lt;bound method Calendar.monthdatescalendar of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.monthdays2calendar = &lt;bound method Calendar.monthdays2calendar of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.monthdayscalendar = &lt;bound method Calendar.monthdayscalendar of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.prmonth = &lt;bound method TextCalendar.prmonth of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.prweek = &lt;bound method TextCalendar.prweek of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.pryear = &lt;bound method TextCalendar.pryear of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.setfirstweekday = &lt;bound method Calendar.setfirstweekday of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.yeardatescalendar = &lt;bound method Calendar.yeardatescalendar of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.yeardays2calendar = &lt;bound method Calendar.yeardays2calendar of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span><span class="line"><span class="go">c.yeardayscalendar = &lt;bound method Calendar.yeardayscalendar of &lt;__main__.TextCalendar object at 0x7416de93af90&gt;&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we use <code>attrs</code> we&rsquo;ll see <em>just</em> the non-method attributes:</p>

<figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="pycon"><span class="line"><span class="go">(Pdb) attrs c</span>
</span><span class="line"><span class="go">c._firstweekday = 0</span>
</span><span class="line"><span class="go">c.firstweekday = 0</span>
</span></code></pre></td></tr></table></div></figure>


<p>And <code>vars</code> will show us just the attributes that live as proper instance attributes in that object&rsquo;s <code>__dict__</code> dictionary:</p>

<figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="pycon"><span class="line"><span class="go">(Pdb) vars c</span>
</span><span class="line"><span class="go">c._firstweekday = 0</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>src</code> alias can be used to see the source code for a given method:</p>

<figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="pycon"><span class="line"><span class="go">(Pdb) src c.prmonth</span>
</span><span class="line"><span class="go">/home/trey/.local/share/uv/python/cpython-3.15.0a3-linux-x86_64-gnu/lib/python3.15/calendar.py on line 404:</span>
</span><span class="line"><span class="go">    def prmonth(self, theyear, themonth, w=0, l=0):</span>
</span><span class="line"><span class="go">        &quot;&quot;&quot;</span>
</span><span class="line"><span class="go">        Print a month's calendar.</span>
</span><span class="line"><span class="go">        &quot;&quot;&quot;</span>
</span><span class="line"><span class="go">        print(self.formatmonth(theyear, themonth, w, l), end='')</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the <code>loc</code> alias will show us all the local variables defined in the current scope:</p>

<figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
<span class="line-number">51</span>
<span class="line-number">52</span>
<span class="line-number">53</span>
<span class="line-number">54</span>
<span class="line-number">55</span>
<span class="line-number">56</span>
<span class="line-number">57</span>
<span class="line-number">58</span>
</pre></td><td class="code"><pre><code class="pycon"><span class="line"><span class="go">(Pdb) loc</span>
</span><span class="line"><span class="go">APRIL = __main__.APRIL</span>
</span><span class="line"><span class="go">AUGUST = __main__.AUGUST</span>
</span><span class="line"><span class="go">Calendar = &lt;class '__main__.Calendar'&gt;</span>
</span><span class="line"><span class="go">DECEMBER = __main__.DECEMBER</span>
</span><span class="line"><span class="go">Day = &lt;enum 'Day'&gt;</span>
</span><span class="line"><span class="go">FEBRUARY = __main__.FEBRUARY</span>
</span><span class="line"><span class="go">FRIDAY = __main__.FRIDAY</span>
</span><span class="line"><span class="go">HTMLCalendar = &lt;class '__main__.HTMLCalendar'&gt;</span>
</span><span class="line"><span class="go">IllegalMonthError = &lt;class '__main__.IllegalMonthError'&gt;</span>
</span><span class="line"><span class="go">IllegalWeekdayError = &lt;class '__main__.IllegalWeekdayError'&gt;</span>
</span><span class="line"><span class="go">IntEnum = &lt;enum 'IntEnum'&gt;</span>
</span><span class="line"><span class="go">JANUARY = __main__.JANUARY</span>
</span><span class="line"><span class="go">JULY = __main__.JULY</span>
</span><span class="line"><span class="go">JUNE = __main__.JUNE</span>
</span><span class="line"><span class="go">LocaleHTMLCalendar = &lt;class '__main__.LocaleHTMLCalendar'&gt;</span>
</span><span class="line"><span class="go">LocaleTextCalendar = &lt;class '__main__.LocaleTextCalendar'&gt;</span>
</span><span class="line"><span class="go">MARCH = __main__.MARCH</span>
</span><span class="line"><span class="go">MAY = __main__.MAY</span>
</span><span class="line"><span class="go">MONDAY = __main__.MONDAY</span>
</span><span class="line"><span class="go">Month = &lt;enum 'Month'&gt;</span>
</span><span class="line"><span class="go">NOVEMBER = __main__.NOVEMBER</span>
</span><span class="line"><span class="go">OCTOBER = __main__.OCTOBER</span>
</span><span class="line"><span class="go">SATURDAY = __main__.SATURDAY</span>
</span><span class="line"><span class="go">SEPTEMBER = __main__.SEPTEMBER</span>
</span><span class="line"><span class="go">SUNDAY = __main__.SUNDAY</span>
</span><span class="line"><span class="go">THURSDAY = __main__.THURSDAY</span>
</span><span class="line"><span class="go">TUESDAY = __main__.TUESDAY</span>
</span><span class="line"><span class="go">TextCalendar = &lt;class '__main__.TextCalendar'&gt;</span>
</span><span class="line"><span class="go">WEDNESDAY = __main__.WEDNESDAY</span>
</span><span class="line"><span class="go">_CLIDemoCalendar = &lt;class '__main__._CLIDemoCalendar'&gt;</span>
</span><span class="line"><span class="go">_CLIDemoLocaleCalendar = &lt;class '__main__._CLIDemoLocaleCalendar'&gt;</span>
</span><span class="line"><span class="go">_get_default_locale = &lt;function _get_default_locale at 0x7416de7c0930&gt;</span>
</span><span class="line"><span class="go">_locale = &lt;module 'locale' from '/home/trey/.local/share/uv/python/cpython-3.15.0a3-linux-x86_64-gnu/lib/python3.15/locale.py'&gt;</span>
</span><span class="line"><span class="go">_localized_day = &lt;class '__main__._localized_day'&gt;</span>
</span><span class="line"><span class="go">_localized_month = &lt;class '__main__._localized_month'&gt;</span>
</span><span class="line"><span class="go">_monthlen = &lt;function _monthlen at 0x7416de7c0720&gt;</span>
</span><span class="line"><span class="go">_nextmonth = &lt;function _nextmonth at 0x7416de7c0880&gt;</span>
</span><span class="line"><span class="go">_prevmonth = &lt;function _prevmonth at 0x7416de7c07d0&gt;</span>
</span><span class="line"><span class="go">_validate_month = &lt;function _validate_month at 0x7416de7c05c0&gt;</span>
</span><span class="line"><span class="go">c = &lt;__main__.TextCalendar object at 0x7416de93af90&gt;</span>
</span><span class="line"><span class="go">datetime = &lt;module 'datetime' from '/home/trey/.local/share/uv/python/cpython-3.15.0a3-linux-x86_64-gnu/lib/python3.15/datetime.py'&gt;</span>
</span><span class="line"><span class="go">day_abbr = &lt;__main__._localized_day object at 0x7416de941090&gt;</span>
</span><span class="line"><span class="go">day_name = &lt;__main__._localized_day object at 0x7416de93acf0&gt;</span>
</span><span class="line"><span class="go">different_locale = &lt;class '__main__.different_locale'&gt;</span>
</span><span class="line"><span class="go">error = &lt;class 'ValueError'&gt;</span>
</span><span class="line"><span class="go">global_enum = &lt;function global_enum at 0x7416dee17480&gt;</span>
</span><span class="line"><span class="go">isleap = &lt;function isleap at 0x7416dea92770&gt;</span>
</span><span class="line"><span class="go">leapdays = &lt;function leapdays at 0x7416de7c0460&gt;</span>
</span><span class="line"><span class="go">mdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]</span>
</span><span class="line"><span class="go">month_abbr = &lt;__main__._localized_month object at 0x7416de9411d0&gt;</span>
</span><span class="line"><span class="go">month_name = &lt;__main__._localized_month object at 0x7416de93ae40&gt;</span>
</span><span class="line"><span class="go">monthrange = &lt;function monthrange at 0x7416de7c0670&gt;</span>
</span><span class="line"><span class="go">repeat = &lt;class 'itertools.repeat'&gt;</span>
</span><span class="line"><span class="go">standalone_month_abbr = &lt;__main__._localized_month object at 0x7416de954fc0&gt;</span>
</span><span class="line"><span class="go">standalone_month_name = &lt;__main__._localized_month object at 0x7416de941310&gt;</span>
</span><span class="line"><span class="go">sys = &lt;module 'sys' (built-in)&gt;</span>
</span><span class="line"><span class="go">weekday = &lt;function weekday at 0x7416de7c0510&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2><code>~/.pdbrc</code> isn&rsquo;t as powerful as <code>PYTHONSTARTUP</code></h2>

<p>I also have a custom <code>PYTHONSTARTUP</code> file, which is launched every time I start a new Python REPL (see <a href="https://treyhunner.com/2025/10/handy-python-repl-modifications/">Handy Python REPL modifications</a>).
A <code>PYTHONSTARTUP</code> file is just Python code, which makes it easy to customize.</p>

<p>A <code>~/.pdbrc</code> file is <em>not</em> Python code&hellip; it&rsquo;s a very limited custom file format.</p>

<p>You may notice that every <code>alias</code> line defined in my <code>~/.pdbrc</code> file is a bunch of code shoved all on one line.
That&rsquo;s because there&rsquo;s no way to define an alias over multiple lines.</p>

<p>Also any variables assigned in an <code>alias</code> will leak into the surrounding scope&hellip; so I have a <code>del</code> statement in a couple of those aliases to clean up a stray variable assignment (from an <code>import</code>).</p>

<p>See the documentation on <a href="https://docs.python.org/3/library/pdb.html#pdbcommand-alias"><code>alias</code></a> and the top of the <a href="https://docs.python.org/3/library/pdb.html#debugger-commands">debugger commands</a> for more on how <code>~/.pdbrc</code> files work.</p></content:encoded>
	
	<dc:date>2026-04-06T14:30:00+00:00</dc:date>
	
</item>

<item rdf:about="https://realpython.com/python-news-april-2026/">
	<title>Real Python: D-Strings Could End Your textwrap.dedent() Days and Other Python News for April 2026</title>
	<link>https://realpython.com/python-news-april-2026/</link>
	
	<content:encoded><div><p>If you’ve ever wrapped a multiline string in <code>textwrap.dedent()</code> and wondered why Python can’t just handle that for you, then your PEP has arrived. <a href="https://peps.python.org/pep-0822/">PEP 822</a> proposes <strong>d-strings</strong>, a new <code>d"""..."""</code> prefix that automatically strips leading indentation. It’s one of those small quality-of-life ideas that make you wonder why it didn’t exist already. The <a class="ref-link" href="https://realpython.com/ref/glossary/pep/">PEP</a> is currently a draft proposal.</p>
<p>March also delivered <strong>Python 3.15.0 alpha 7</strong> with <a href="https://peps.python.org/pep-0810/">lazy imports</a> you can finally test and security patches across three older branches. On the ecosystem side, <strong>GPT-5.4</strong> landed with a tool search feature that changes agentic workflows. Meanwhile, the Python Insider blog migration moved 307 posts to a new home without breaking a single URL. It’s time to get into the biggest <strong>Python news</strong> from the past month.</p>
<div class="alert alert-warning">
<p><strong>Join Now:</strong> <a class="alert-link" href="https://realpython.com/bonus/newsletter/">Click here to join the Real Python Newsletter</a> and you’ll never miss another Python tutorial, course, or news update.</p>
</div>
<h2 id="python-releases-and-pep-highlights">Python Releases and PEP Highlights<a class="headerlink" href="https://realpython.com/atom.xml#python-releases-and-pep-highlights" title="Permanent link"></a></h2>
<p>March brought the penultimate alpha of Python 3.15 with a long-awaited feature that finally lets Python developers defer imports cleanly. On top of that, security patches landed for three older branches, and a fresh PEP proposal showed up that could clean up your multiline strings for good.</p>
<h3 id="python-3150-alpha-7-lazy-imports-land">Python 3.15.0 Alpha 7: Lazy Imports Land<a class="headerlink" href="https://realpython.com/atom.xml#python-3150-alpha-7-lazy-imports-land" title="Permanent link"></a></h3>
<p><a href="https://www.python.org/downloads/release/python-3150a7/">Python 3.15.0a7</a> dropped on March 10, the second-to-last alpha before the beta freeze on May 5. The headline feature you can finally test is <a href="https://peps.python.org/pep-0810/">PEP 810</a>, <strong>explicit lazy imports</strong>. The <a class="ref-link" href="https://realpython.com/ref/glossary/python-steering-council/">Steering Council</a> <a href="https://realpython.com/python-news-december-2025/#pep-810-accepted-explicit-lazy-imports">accepted PEP 810 back in November</a>, but this is the first alpha where the implementation is available to try.</p>
<p>The idea is straightforward: prefix any <a href="https://realpython.com/python-import/">import statement</a> with <code>lazy</code>, and the <a class="ref-link" href="https://realpython.com/ref/glossary/module/">module</a> won’t actually load until you first access an <a class="ref-link" href="https://realpython.com/ref/glossary/attribute/">attribute</a> on it:</p>

  <div class="codeblock__header codeblock--blue">
    <span class="mr-2 noselect">Python</span>
    
    <div class="noselect">
      
    </div>
  </div>
  <div class="codeblock__contents">
    <div class="highlight highlight--with-header"><pre><span></span><code><span class="n">lazy</span> <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
<span class="n">lazy</span> <span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">timedelta</span>

<span class="c1"># The json module isn't loaded yet, so no startup cost</span>

<span class="c1"># Later, when you actually use it:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>  <span class="c1"># Now it loads</span>
</code></pre></div>
    
    <button class="codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only" title="Copy to clipboard"><span class="icon baseline"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></button>
    
  </div>

<p>The PEP authors note that <strong>17 percent of <a class="ref-link" href="https://realpython.com/ref/glossary/standard-library/">standard library</a> imports</strong> are already placed inside functions to defer loading. Tools like <a href="https://realpython.com/learning-paths/django-web-development/">Django’s</a> management commands, <a href="https://realpython.com/python-click/">Click</a>-based CLIs, and codebases heavy on <a href="https://realpython.com/python-type-checking/">type checking</a> often spend hundreds of milliseconds on imports they might never use. Lazy imports make that optimization explicit and clean, without scattering imports deep inside <a class="ref-link" href="https://realpython.com/ref/glossary/function/">function</a> bodies.</p>
<div class="alert alert-primary">
<p><strong>Note:</strong> Alpha 7 also continues to ship the <a href="https://realpython.com/python313-free-threading-jit/#jit-compiler">JIT compiler</a> improvements from <a href="https://realpython.com/python-news-march-2026/#python-3150-alpha-6-comprehension-unpacking-and-more">earlier alphas</a>, with <strong>3–4 percent geometric mean gains on x86-64 Linux</strong> and <strong>7–8 percent on AArch64 macOS</strong>. Alpha 8 is scheduled for April 7, with the beta phase starting May 5.</p>
</div>
<h3 id="security-releases-python-31213-31115-and-31020">Security Releases: Python 3.12.13, 3.11.15, and 3.10.20<a class="headerlink" href="https://realpython.com/atom.xml#security-releases-python-31213-31115-and-31020" title="Permanent link"></a></h3>
<p>On March 3, Thomas Wouters released security-only patches across three older Python branches. The updates fix several CVEs, including two XML parsing vulnerabilities (<a href="https://www.cve.org/CVERecord?id=CVE-2026-24515">CVE-2026-24515</a> and <a href="https://www.cve.org/CVERecord?id=CVE-2026-25210">CVE-2026-25210</a>), patched by upgrading the bundled libexpat to 2.7.4. Additional fixes cover an XML memory amplification bug and the rejection of control characters in HTTP headers and URL parsing.</p>
<p>If you’re still running Python 3.12 or older in production, applying these patches is highly recommended. Python 3.12 is now in security-fixes-only mode, so no binary installers are provided. You’ll need to build from source.</p>
<h3 id="pep-822-dedented-multiline-strings-d-strings">PEP 822: Dedented Multiline Strings (D-Strings)<a class="headerlink" href="https://realpython.com/atom.xml#pep-822-dedented-multiline-strings-d-strings" title="Permanent link"></a></h3>
<p><a href="https://peps.python.org/pep-0822/">PEP 822</a>, authored by Inada Naoki, proposes a new <code>d"""..."""</code> string prefix that automatically strips leading <a class="ref-link" href="https://realpython.com/ref/glossary/indentation/">indentation</a> from multiline strings, using the same algorithm as <code>textwrap.dedent()</code>.</p>
<p>Anyone who’s written a multiline SQL query or help text inside a <a href="https://realpython.com/defining-your-own-python-function/">function</a> and battled with indentation knows the pain:</p>

  <div class="codeblock__header codeblock--blue">
    <span class="mr-2 noselect">Python</span>
    
    <div class="noselect">
      
    </div>
  </div>
  <div class="codeblock__contents">
    <div class="highlight highlight--with-header"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">textwrap</span>

<span class="c1"># Before: awkward indentation or textwrap.dedent() wrapper</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_query</span><span class="p">():</span>
    <span class="k">return</span> <span class="n">textwrap</span><span class="o">.</span><span class="n">dedent</span><span class="p">(</span><span class="s2">"""</span><span class="se">\</span>
<span class="s2">        SELECT name, email</span>
<span class="s2">        FROM users</span>
<span class="s2">        WHERE active = true</span>
<span class="s2">    """</span><span class="p">)</span>

<span class="c1"># With d-strings: clean and readable</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_query</span><span class="p">():</span>
    <span class="k">return</span> <span class="n">d</span><span class="s2">"""</span>
<span class="s2">        SELECT name, email</span>
<span class="s2">        FROM users</span>
<span class="s2">        WHERE active = true</span>
<span class="s2">    """</span>
</code></pre></div>
    
    <button class="codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only" title="Copy to clipboard"><span class="icon baseline"><svg xmlns="http://www.w3.org/2000/svg"><use></use></svg></span></button>
    
  </div>

<p>The <code>d</code> prefix combines with <code>f</code>, <code>r</code>, <code>b</code>, and even the upcoming <code>t</code> (<a href="https://realpython.com/python-t-strings/">template strings</a>) prefixes. PEP 822 was submitted to the Steering Council on March 9 and targets Python 3.15, though a decision hasn’t landed yet. If you’ve ever wished Python strings would just handle indentation for you, this one’s worth keeping an eye on.</p>
<h3 id="other-peps-in-progress">Other PEPs in Progress<a class="headerlink" href="https://realpython.com/atom.xml#other-peps-in-progress" title="Permanent link"></a></h3>
</div><h2><a href="https://realpython.com/python-news-april-2026/?utm_source=realpython&amp;utm_medium=rss">Read the full article at https://realpython.com/python-news-april-2026/ »</a></h2>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-06T14:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://realpython.com/quizzes/for-loop-python/">
	<title>Real Python: Quiz: For Loops in Python (Definite Iteration)</title>
	<link>https://realpython.com/quizzes/for-loop-python/</link>
	
	<content:encoded><p>Test your understanding of <a href="https://realpython.com/courses/python-for-loop/">For Loops in Python (Definite Iteration)</a>.</p>
<p>You&rsquo;ll revisit Python loops, iterables, and how iterators behave. You&rsquo;ll also explore set iteration order and the effects of the <code>break</code> and <code>continue</code> statements.</p>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-06T12:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://pythonbytes.fm/episodes/show/476/common-themes">
	<title>Python Bytes: #476 Common themes</title>
	<link>https://pythonbytes.fm/episodes/show/476/common-themes</link>
	
	<content:encoded><strong>Topics covered in this episode:</strong><br />

<ul>
	<li><strong><a href="https://pydevtools.com/blog/migrating-from-mypy-to-ty-lessons-from-fastapi/?featured_on=pythonbytes">Migrating from mypy to ty: Lessons from FastAPI</a></strong></li>
<li><strong><a href="https://oxyde.fatalyst.dev/latest/?featured_on=pythonbytes">Oxyde ORM</a></strong></li>
<li><strong><a href="https://guoci.github.io/typeshedded_CPython_docs/library/functions.html?featured_on=pythonbytes">Typeshedded CPython docs</a></strong></li>
<li><strong><a href="https://mkennedy.codes/posts/raw-dc-a-retrospective/?featured_on=pythonbytes">Raw+DC Database Pattern: A Retrospective</a></strong></li>
<li><strong>Extras</strong></li>
<li><strong>Joke</strong></li>

</ul><a href="https://www.youtube.com/watch?v=tOM8fOhcNbI" style="font-weight: bold;">Watch on YouTube</a><br />

<p><strong>About the show</strong></p>

<p>Sponsored by us! Support our work through:</p>

<ul>
<li>Our <a href="https://training.talkpython.fm/?featured_on=pythonbytes"><strong>courses at Talk Python Training</strong></a></li>
<li><a href="https://courses.pythontest.com/p/the-complete-pytest-course?featured_on=pythonbytes"><strong>The Complete pytest Course</strong></a></li>
<li><a href="https://www.patreon.com/pythonbytes"><strong>Patreon Supporters</strong></a></li>
</ul>

<p><strong>Connect with the hosts</strong></p>

<ul>
<li>Michael: <a href="https://fosstodon.org/@mkennedy">@mkennedy@fosstodon.org</a> / <a href="https://bsky.app/profile/mkennedy.codes?featured_on=pythonbytes">@mkennedy.codes</a> (bsky)</li>
<li>Brian: <a href="https://fosstodon.org/@brianokken">@brianokken@fosstodon.org</a> / <a href="https://bsky.app/profile/brianokken.bsky.social?featured_on=pythonbytes">@brianokken.bsky.social</a></li>
<li>Show: <a href="https://fosstodon.org/@pythonbytes">@pythonbytes@fosstodon.org</a> / <a href="https://bsky.app/profile/pythonbytes.fm">@pythonbytes.fm</a> (bsky)</li>
</ul>

<p>Join us on YouTube at <a href="https://pythonbytes.fm/stream/live"><strong>pythonbytes.fm/live</strong></a> to be part of the audience. Usually <strong>Monday</strong> at 11am PT. Older video versions available there too.</p>

<p>Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to <a href="https://pythonbytes.fm/friends-of-the-show">our friends of the show list</a>, we'll never share it.</p>

<p><strong>Brian #1: <a href="https://pydevtools.com/blog/migrating-from-mypy-to-ty-lessons-from-fastapi/?featured_on=pythonbytes">Migrating from mypy to ty: Lessons from FastAPI</a></strong></p>

<ul>
<li>Tim Hopper</li>
<li>I saw this post by Sebastián Ramírez about all of his projects <a href="https://bsky.app/profile/tiangolo.com/post/3milnufxpcs2h?featured_on=pythonbytes">switching to ty</a>
<ul>
<li>FastAPI, Typer, SQLModel, Asyncer, FastAPI CLI</li>
</ul></li>
<li>SqlModel is already ty only - mypy removed</li>
<li>This signals that ty is ready to use</li>
<li>Tim lists some steps to apply ty to your own projects
<ul>
<li>Add ty alongside mypy</li>
<li>Set <code>error-on-warning = true</code></li>
<li>Accept the double-ignore comments</li>
<li>Pick a smaller project to cut over first</li>
<li>Drop mypy when the noise exceeds the signalAdd ty alongside mypy</li>
</ul></li>
<li>Related  anecdote:
<ul>
<li>I had tried out ty with <a href="https://github.com/okken/pytest-check?featured_on=pythonbytes">pytest-check</a> in the past with difficulty</li>
<li>Tried it again this morning, only a few areas where mypy was happy but ty reported issues</li>
<li>At least one ty warning was a potential problem for people running pre-releases of pytest,</li>
<li>Not really related: <a href="https://packaging.pypa.io/en/latest/version.html?featured_on=pythonbytes">packaging.version.parse</a> is awesome</li>
</ul></li>
</ul>

<p><strong>Michael #2: <a href="https://oxyde.fatalyst.dev/latest/?featured_on=pythonbytes">Oxyde ORM</a></strong></p>

<ul>
<li><strong>Oxyde ORM</strong> is a type-safe, Pydantic-centric asynchronous ORM with a high-performance Rust core.</li>
<li>Note: Oxyde is a young project under active development. The API may evolve between minor versions.</li>
<li>No sync wrappers or thread pools. Oxyde is async from the ground up</li>
<li>Includes <a href="https://github.com/mr-fatalyst/oxyde-admin?featured_on=pythonbytes"><strong>oxyde-admin</strong></a></li>
<li>Features
<ul>
<li><strong>Django-style API</strong> - Familiar <code>Model.objects.filter()</code> syntax</li>
<li><strong>Pydantic v2 models</strong> - Full validation, type hints, serialization</li>
<li><strong>Async-first</strong> - Built for modern async Python with <code>asyncio</code></li>
<li><strong>Rust performance</strong> - SQL generation and execution in native Rust</li>
<li><strong>Multi-database</strong> - PostgreSQL, SQLite, MySQL support</li>
<li><strong>Transactions</strong> - <code>transaction.atomic()</code> context manager with savepoints</li>
<li><strong>Migrations</strong> - Django-style <code>makemigrations</code> and <code>migrate</code> CLI</li>
</ul></li>
</ul>

<p><strong>Brian #3:</strong> <a href="https://guoci.github.io/typeshedded_CPython_docs/library/functions.html?featured_on=pythonbytes">Typeshedded CPython docs</a></p>

<ul>
<li><a href="https://bsky.app/profile/emmatyping.dev/post/3mfhxrttu2s22?featured_on=pythonbytes"><strong>Thanks emmatyping for the suggestion</strong></a></li>
<li>Documentation for Python with typeshed types</li>
<li>Source: <a href="https://github.com/guoci/typeshedding_cpython_docs?featured_on=pythonbytes"><strong>typeshedding_cpython_docs</strong></a></li>
</ul>

<p><strong>Michael #4:</strong> <a href="https://mkennedy.codes/posts/raw-dc-a-retrospective/?featured_on=pythonbytes">Raw+DC Database Pattern: A Retrospective</a></p>

<ul>
<li>A new design pattern I’m seeing gain traction in the software space: <a href="https://mkennedy.codes/posts/raw-dc-the-orm-pattern-of-2026/?featured_on=pythonbytes">Raw+DC: The ORM pattern of 2026</a></li>
<li>I’ve had a chance to migrate three of my most important web app.</li>
<li>Thrilled to report that yes, <strong>the web app is much faster using Raw+DC</strong></li>
<li>Plus, this was part of the journey to move from 1.3 GB memory usage to 0.45 GB (more on this next week)</li>
</ul>

<p><img alt="" src="https://cdn.mkennedy.codes/posts/raw-dc-a-retrospective/raw-dc-vs-mongoengine-graph.webp" /></p>

<p><strong>Extras</strong></p>

<p>Brian:</p>

<ul>
<li><a href="https://courses.pythontest.com/lean-tdd/?featured_on=pythonbytes">Lean TDD 0.5 update</a>
<ul>
<li>Significant rewrite and focus</li>
</ul></li>
</ul>

<p>Michael:</p>

<ul>
<li><a href="https://github.com/databooth/pytest-just?featured_on=pythonbytes">pytest-just</a> (for <a href="https://github.com/casey/just?featured_on=pythonbytes">just command file</a> testing), by Michael Booth</li>
<li>Something going on with Encode
<ul>
<li><strong>httpx</strong>: <a href="https://www.reddit.com/r/Python/comments/1rl5kuq/anyone_know_whats_up_with_httpx/?featured_on=pythonbytes">Anyone know what's up with HTTPX?</a> And <a href="https://tildeweb.nl/~michiel/httpxyz.html?featured_on=pythonbytes">forked</a></li>
<li><strong>starlette</strong> and <strong>uvicorn</strong>: <a href="https://github.com/Kludex/starlette/discussions/2997?featured_on=pythonbytes">Transfer of Uvicorn &amp; Starlette</a></li>
<li><strong>mkdocs</strong>: <a href="https://fpgmaas.com/blog/collapse-of-mkdocs/?featured_on=pythonbytes">The Slow Collapse of MkDocs</a></li>
<li><strong>django-rest-framework:</strong> <a href="https://github.com/django-commons/membership/issues/188#issue-3070631761">Move to django commons?</a></li>
</ul></li>
<li><a href="https://talkpython.fm/blog/posts/announcing-course-completion-certificates/?featured_on=pythonbytes">Certificates at Talk Python Training</a></li>
</ul>

<p><strong>Joke:</strong> </p>

<ul>
<li><a href="https://x.com/PR0GRAMMERHUM0R/status/2021509552504525304?featured_on=pythonbytes"><strong>Neue Rich</strong></a></li>
</ul></content:encoded>
	
	<dc:date>2026-04-06T08:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://blog.europython.eu/humans-of-ep-george/">
	<title>EuroPython: Humans of EuroPython: George Zisopoulos</title>
	<link>https://blog.europython.eu/humans-of-ep-george/</link>
	
	<content:encoded><p>Behind every flawless talk, engaging workshop, and perfectly timed coffee break at EuroPython is a crew of unsung heroes&#x2014;our volunteers! &#x1f31f; Not just organizers, but dream enablers: printer ninjas, registration magicians, social butterflies, and even salsa instructors (yeah, that happened!)&#xa0;</p><p>We&#x2019;re the quiet force turning chaos into community, one sprint at a time. &#x1f4bb;&#x2728;&#xa0;</p><p>Curious who really makes the magic happen? Today we&#x2019;d like to introduce George Zisopoulos, member of the Operations team at EuroPython 2025.&#xa0; </p><figure class="kg-card kg-image-card kg-card-hascaption"><img alt="alt" class="kg-image" height="675" src="https://blog.europython.eu/content/images/2026/03/george-mastodon.png" width="1200" /><figcaption><span style="white-space: pre-wrap;">George Zisopoulos, member of the Operations Team at EuroPython 2025</span></figcaption></figure><p><strong>EP: What first inspired you to volunteer for EuroPython? And which edition of the conference was it?</strong></p><p>I was inspired because I gave a presentation in 2020, and after that I wanted to experience the conference from the other side, as part of the volunteers. It was amazing to see how much work all these people had done for us as attendees, and I wanted to be a part of that.</p><p>So I applied and became an online volunteer in 2022 in Dublin, and the following year I joined EuroPython 2023 as an on-site volunteer. Once you start, you can&#x2019;t stop doing it.</p><p><strong>EP: Have you learned new skills while contributing to EuroPython? If so, which ones?</strong></p><p>It&#x2019;s less about learning new skills and more about discovering the ones you already have. With guidance and a supportive team, you feel confident using them and even pushing a bit past your comfort zone.</p><p><strong>EP: What&apos;s your favorite memory from volunteering at the conference?</strong></p><p>My favorite part is walking into the conference and unexpectedly running into someone you met at previous years&#x2019; editions. It&#x2019;s like a little d&#xe9;j&#xe0; vu. They hug you like you just saw them yesterday, even if it&#x2019;s been a whole year.</p><p><strong>EP: Did you make any lasting friendships or professional connections through volunteering?</strong></p><p>Yes, I&#x2019;ve made a few lasting friendships. We stay in touch all year, even though we live in different cities or countries. We visit each other, and often end up meeting in other countries while traveling.</p><p><strong>EP: Any unexpected or funny experiences during the conference which you&#x2019;d like to share?</strong></p><p>I love coffee, so during the conference I&#x2019;m usually wandering around with a cup in hand. Two years ago, thanks to some playful hits from friends, I ended up destroying three t-shirts with coffee during the conference! Now every year they wonder&#x2026; How many shirts will I sacrifice this time?</p><p><strong>EP: Would you volunteer again, and why?</strong></p><p>I would say what I used to say last year: Summer without EuroPython just doesn&#x2019;t really feel like a summer &#x1f609; See you all there!</p><p><strong>EP: Thank you for your contribution, George!</strong></p></content:encoded>
	
	<dc:date>2026-04-05T14:18:50+00:00</dc:date>
	
</item>

<item rdf:about="https://www.grulic.org.ar/~mdione/glob/posts/correcting-openstreetmap-wrong-tag-values/">
	<title>Marcos Dione: Correcting OpenStreetMap wrong tag values</title>
	<link>https://www.grulic.org.ar/~mdione/glob/posts/correcting-openstreetmap-wrong-tag-values/</link>
	
	<content:encoded><p>As a hobbyist consumer of OSM data to render maps, I find wrong tags annoying. Bad values mean that the 
resulting map is wrong or incomplete, so less useful. I decided to attack the most egregious ones, which
include typos, street names instead of type and some other errors. The idea is to attack the long tail 
first, so I'm not blocked because the next batch of errors (objects with exactly the same error) looks
too big (yes, OCD).</p>
<p>So I hacked a small python script to help me find and edit them:</p>
<div class="code"><pre class="code literal-block"><span class="ch">#! /usr/bin/env python3</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">psycopg2</span>


<span class="k">def</span><span class="w"> </span><span class="nf">main</span><span class="p">():</span>
    <span class="n">db</span> <span class="o">=</span> <span class="n">psycopg2</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">dbname</span><span class="o">=</span><span class="s1">'europe'</span><span class="p">)</span>
    <span class="n">cursor</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>

    <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'''</span>
<span class="s1">        SELECT</span>
<span class="s1">            count(*) AS count,</span>
<span class="s1">            highway</span>
<span class="s1">        FROM planet_osm_line</span>
<span class="s1">        WHERE</span>
<span class="s1">            highway IS NOT NULL</span>
<span class="s1">        GROUP BY highway</span>
<span class="s1">        ORDER BY count ASC</span>
<span class="s1">    '''</span><span class="p">)</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">cursor</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>

    <span class="k">for</span> <span class="n">count</span><span class="p">,</span> <span class="n">highway</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"next </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">highway</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

        <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s1">'''</span>
<span class="s1">            SELECT osm_id</span>
<span class="s1">            FROM planet_osm_line</span>
<span class="s1">            WHERE</span>
<span class="s1">                highway = </span><span class="si">%s</span>
<span class="s1">        '''</span><span class="p">,</span> <span class="p">(</span><span class="n">highway</span><span class="p">,</span> <span class="p">))</span>

        <span class="k">for</span> <span class="p">(</span><span class="n">osm_id</span><span class="p">,</span> <span class="p">)</span> <span class="ow">in</span> <span class="n">cursor</span><span class="o">.</span><span class="n">fetchall</span><span class="p">():</span>
            <span class="k">if</span> <span class="n">osm_id</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
                <span class="c1"># in rendering DBs, this is a relation</span>
                <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="sa">f</span><span class="s2">"librewolf -P default 'https://www.openstreetmap.org/edit?relation=</span><span class="si">{</span><span class="o">-</span><span class="n">osm_id</span><span class="si">}</span><span class="s2">'"</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="sa">f</span><span class="s2">"librewolf -P default 'https://www.openstreetmap.org/edit?way=</span><span class="si">{</span><span class="n">osm_id</span><span class="si">}</span><span class="s2">'"</span><span class="p">)</span>


<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>

<p>It <em>is</em> quite inefficient, but what I want is to edit the errors, not to write a script :) This requires
a rendering database, which I already have locally :)</p>
<p>From here the workflow is:</p>
<ul>
<li>Analyze the type of error.<ul>
<li>This includes looking at the history of the object.</li>
</ul>
</li>
<li>Search the wiki.</li>
<li>Correct the error or leave a note.</li>
<li>Find the original changeset and leave a note if needed.</li>
<li>Add any details to te changeset if needed.</li>
</ul>
<p>In my machine, finding the long tail, and finding each set of errors takes one minute, so I was launching 
two at the same time. One of the things to notice is that if the object you try to edit does no exists 
anymore, you get and edit view of the whole planet.</p></content:encoded>
	
	<dc:date>2026-04-04T10:16:47+00:00</dc:date>
	
</item>

<item rdf:about="https://lucumr.pocoo.org/2026/4/4/absurd-in-production/">
	<title>Armin Ronacher: Absurd In Production</title>
	<link>https://lucumr.pocoo.org/2026/4/4/absurd-in-production/</link>
	
	<content:encoded><p>About five months ago I wrote about <a href="https://lucumr.pocoo.org/2025/11/3/absurd-workflows/">Absurd</a>, a
durable execution system we built for our own use at Earendil, sitting entirely
on top of Postgres and Postgres alone.  The pitch was simple: you don&#8217;t need a
<a href="https://hatchet.run/">separate</a> <a href="https://www.inngest.com/">service</a>, <a href="https://useworkflow.dev/">a
compiler plugin</a>, or <a href="https://temporal.io/">an entire
runtime</a> to get durable workflows.  You need a SQL file
and a thin SDK.</p>
<p>Since then we&#8217;ve been running it in production, and I figured it&#8217;s worth
sharing what the experience has been like.  The short version: the design
held up, the system has been a pleasure to work with, and other people seem
to agree.</p>
<h2>A Quick Refresher</h2>
<p>Absurd is a durable execution system that lives entirely inside Postgres.
The core is a single SQL file
(<a href="https://github.com/earendil-works/absurd/blob/main/sql/absurd.sql">absurd.sql</a>)
that defines stored procedures for task management, checkpoint storage, event
handling, and claim-based scheduling.  On top of that sit thin SDKs (currently
<a href="https://www.npmjs.com/package/absurd-sdk">TypeScript</a>,
<a href="https://pypi.org/project/absurd-sdk/">Python</a> and an experimental
<a href="https://github.com/earendil-works/absurd/tree/main/sdks/go/absurd">Go</a> one)
that make the system ergonomic in your language of choice.</p>
<p>The model is straightforward: you register tasks, decompose them into steps,
and each step acts as a checkpoint.  If anything fails, the task retries from
the last completed step.  Tasks can sleep, wait for external events, and
suspend for days or weeks.  All state lives in Postgres.</p>
<p>If you want the full introduction, the <a href="https://lucumr.pocoo.org/2025/11/3/absurd-workflows/">original blog
post</a> covers the fundamentals.  What follows here
is what we&#8217;ve learned since.</p>
<h2>What Changed</h2>
<p>The project got multiple releases over the last five months.  Most of the
changes are things you&#8217;d expect from a system that people actually started
depending on: hardened claim handling, watchdogs that terminate broken workers,
deadlock prevention, proper lease management, event race conditions, and all the
edge cases that only show up when you&#8217;re running real workloads.</p>
<p>A few things worth calling out specifically.</p>
<p><strong>Decomposed steps.</strong>  The original design only had <code>ctx.step()</code>, where you pass
in a function and get back its checkpointed result.  That works well for many
cases but not all.  Sometimes you need to know whether a step already ran before
deciding what to do next.  So we added <code>beginStep()</code> / <code>completeStep()</code>, which
give you a handle you can inspect before committing the result.  This turned out
to be very useful for modeling intentional failures and conditional logic.
This in particular is necessary when working with &#8220;before call&#8221; and &#8220;after call&#8221;
type hook APIs.</p>
<p><strong>Task results.</strong>  You can now spawn a task, go do other things, and later
come back to fetch or await its result.  This sounds obvious in hindsight, but
the original system was purely fire-and-forget.  Having proper result inspection
made it possible to use Absurd for things like spawning child tasks from within
a parent workflow and waiting for them to finish.  This is particularly useful
for debugging with agents too.</p>
<p><strong><a href="https://earendil-works.github.io/absurd/tools/absurdctl/">absurdctl</a>.</strong>  We built this out as a proper CLI tool.  You can initialize
schemas, run migrations, create queues, spawn tasks, emit events, retry failures
from the command line.  It&#8217;s installable via <code>uvx</code> or as a standalone binary.
This has been invaluable for debugging production issues.  When something is
stuck, being able to just <code>absurdctl dump-task --task-id=&lt;id&gt;</code> and see exactly
where it stopped is a very different experience from digging through logs.</p>
<p><strong><a href="https://earendil-works.github.io/absurd/tools/habitat/">Habitat</a>.</strong>  A small Go application that serves up a web dashboard for
monitoring tasks, runs, checkpoints, and events.  It connects directly to
Postgres and gives you a live view of what&#8217;s happening.  It&#8217;s simple, but it&#8217;s
the kind of thing that makes the system more enjoyable for humans.</p>
<p><strong>Agent integration.</strong>  Since Absurd was originally built for agent workloads,
we added a bundled skill that coding agents can discover and use to debug
workflow state via <code>absurdctl</code>.  There&#8217;s also a documented pattern for making
<a href="https://pi.dev/">pi</a> agent turns durable by logging each message as a
checkpoint.</p>
<h2>What Held Up</h2>
<p>The thing I&#8217;m most pleased about is that the core design didn&#8217;t need to change
all that much.  The fundamental model of tasks, steps, checkpoints, events, and
suspending is still exactly what it was initially.  We added features around it,
but nothing forced us to rethink the basic abstractions.</p>
<p>Putting the complexity in SQL and keeping the SDKs thin turned out to be a
genuinely good call.  The TypeScript SDK is about 1,400 lines.  The Python SDK
is about 1,900 but most of this comes from the complexity of supporting colored
functions.  Compare that to Temporal&#8217;s Python SDK at around 170,000 lines.  It
means the SDKs are easy to understand, easy to debug, and easy to port.  When
something goes wrong, you can read the entire SDK in an afternoon and understand
what it does.</p>
<p>The checkpoint-based replay model also aged well.  Unlike systems that require
deterministic replay of your entire workflow function, Absurd just loads the
cached step results and skips over completed work.  That means your code doesn&#8217;t
need to be deterministic outside of steps.  You can call <code>Math.random()</code> or
<code>datetime.now()</code> in between steps and things still work, because only the step
boundaries matter.  In practice, this makes it much easier to reason about
what&#8217;s safe and what isn&#8217;t.</p>
<p>Pull-based scheduling was the right choice too.  Workers pull tasks from
Postgres as they have capacity.  There&#8217;s no coordinator, no push mechanism, no
HTTP callbacks.  That makes it trivially self-hostable and means you don&#8217;t have
to think about load management at the infrastructure level.</p>
<h2>What Might Not Be Optimal</h2>
<p>I had some discussions with folks about whether the right abstraction should have been
a <a href="https://www.distributed-async-await.io/specification/programming-model/durable-promise-specification">durable
promise</a>.
It&#8217;s a very appealing idea, but it turns out to be much more complex to
implement in practice.  It&#8217;s however in theory also more powerful.  I did make
some attempts to see what absurd would look like if it was based on durable
promises but so far did not get anywhere with it.  It&#8217;s however an experiment
that I think would be fun to try!</p>
<h2>What We Use It For</h2>
<p>The primary use case is still agent workflows.  An agent is essentially a loop
that calls an LLM, processes tool results, and repeats until it decides it&#8217;s
done.  Each iteration becomes a step, and each step&#8217;s result is checkpointed.
If the process dies on iteration 7, it restarts and replays iterations 1 through
6 from the store, then continues from 7.</p>
<p>But we&#8217;ve found it useful for a lot of other things too.  All our crons just
dispatch distributed workflows with a pre-generated deduplication key from the
invocation.  We can have two cron processes running and they will only trigger
one absurd task invocation.  We also use it for background processing that needs
to survive deploys.  Basically anything where you&#8217;d otherwise build your own
retry-and-resume logic on top of a queue.</p>
<h2>What&#8217;s Still Missing</h2>
<p>Absurd is deliberately minimal, but there are things I&#8217;d like to see.</p>
<p>There&#8217;s no built-in scheduler.  If you want cron-like behavior, you run your own
scheduler loop and use idempotency keys to deduplicate.  That works, and we have
a <a href="https://earendil-works.github.io/absurd/patterns/cron/">documented pattern for
it</a>, but it would be
nice to have something more integrated.</p>
<p>There&#8217;s no push model.  Everything is pull.  If you need an HTTP endpoint to
receive webhooks and wake up tasks, you build that yourself.  I think that&#8217;s the
right default as push systems are harder to operate and easier to overwhelm but
there are cases where it would be convenient.  In particular there are quite a
few agentic systems where it would be super nice to have webhooks natively
integrated (wake on incoming POST request).  I definitely don&#8217;t want to have
this in the core, but that sounds like the kind of problem that could be a nice
adjacent library that builds on top of absurd.</p>
<p>The biggest omission is that it does not support partitioning yet.  That&#8217;s
unfortunate because it makes cleaning up data more expensive than it has to be.
In theory supporting partitions would be pretty simple.  You could have weekly
partitions and then detach and delete them when they expire.  The only thing
that really stands in the way of that is that Postgres does not have a
convenient way of actually doing that.</p>
<p>The hard part is not partitioning itself, it&#8217;s partition lifecycle management under
real workloads.  If a worker inserts a row whose <code>expires_at</code> lands in a month
without a partition, the insert fails and the workflow crashes.  So you need a
separate maintenance loop that always creates future partitions far enough ahead
for sleeps/retries, and does that for every queue.</p>
<p>On the delete side, the safe approach is <code>DETACH PARTITION CONCURRENTLY</code>, but
getting that to run from <code>pg_cron</code> doesn&#8217;t work because it cannot be run within a
transaction, but <code>pg_cron</code> runs everything in one.</p>
<p>I don&#8217;t think it&#8217;s an unsolvable problem, but it&#8217;s one I have not found a good
solution for and I would love <a href="https://github.com/earendil-works/absurd/issues/4">to get input
on</a>.</p>
<h2>Does Open Source Still Matter?</h2>
<p>This brings me a bit to a meta point on the whole thing which is what the point
of Open Source libraries in the age of agentic engineering is.  Durable
Execution is now something that plenty of startups sell you.  On the other hand
it&#8217;s also something that an agent would build you and people might not even look
for solutions any more.  It&#8217;s kind of … weird?</p>
<p>I don&#8217;t think a durable execution library can support a company, I really
don&#8217;t.  On the other hand I think it&#8217;s just complex enough of a problem that it
could be a good Open Source project void of commercial interests.  You do need a
bit of an ecosystem around it, particularly for UI and good DX for debugging,
and that&#8217;s hard to get from a throwaway implementation.</p>
<p>I don&#8217;t think we have squared this yet, but it&#8217;s already much better to use than
a few months ago.</p>
<p>If you&#8217;re using Absurd, thinking about it, or building adjacent ideas, I&#8217;d love
your feedback. Bug reports, rough edges, design critiques, and contributions are
all very welcome—this project has gotten better every time someone poked at it
from a different angle.</p></content:encoded>
	
	<dc:date>2026-04-04T00:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://pycon.blogspot.com/2026/04/haciendo-historia-celebrating-pycon-uss.html">
	<title>PyCon: ¡Haciendo Historia! Celebrating PyCon US’s First-Ever Spanish-Language Keynote</title>
	<link>https://pycon.blogspot.com/2026/04/haciendo-historia-celebrating-pycon-uss.html</link>
	
	<content:encoded><span id="docs-internal-guid-643cab50-7fff-28c2-aea7-60dadeb1ad68"><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><b id="docs-internal-guid-77cb2ca8-7fff-88d2-a193-ee0637fc814c" style="font-weight: normal;"><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="font-family: arial; font-size: small;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">PyCon US has always been about more than just a programming language; it’s about the incredible, global community that builds, supports, and innovates with it. This year at PyCon US 2026 in Long Beach, we are thrilled to celebrate a remarkable milestone for our community: </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">our very first Spanish-language keynote address</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, delivered by the brilliant Pablo Galindo Salgado!</span></span></p></b></h3><h3 style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt; text-align: justify;"><span style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: arial;">Meet Your Keynote Speaker: Pablo Galindo Salgado</span></span></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><b><span style="font-family: arial; font-size: small;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">If you’ve used Python recently, you’ve benefited from </span><a href="https://pablogsal.com/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Pablo’s work</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Pablo works on the Python team at </span><a href="https://www.hudsonrivertrading.com/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Hudson River Trading</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> and is a </span><a href="https://devguide.python.org/core-team/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">CPython core developer</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. He is currently serving his 6th term on the </span><a href="https://github.com/python/steering-council" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Python Steering Council</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> and served as the release manager for Python 3.10 and 3.11.</span></p><p dir="ltr" style="font-weight: normal; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">But his background isn't just in software engineering—Pablo is a Theoretical Physicist specializing in general relativity and black hole physics! (He also has a cat, though he assures us that his cat does not write any code).</span></p><p dir="ltr" style="font-weight: normal; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">With his deep technical expertise and unique scientific perspective, Pablo is uniquely positioned to deliver an unforgettable keynote. But what makes this moment even more special is the language in which it will be delivered.</span></p></span></b></h3><h3 style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt; text-align: justify;"><span style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: arial; font-size: medium;">Why a Spanish Keynote Matters to PyCon US</span></span></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><b><span style="font-family: arial; font-size: small;"><p style="font-weight: normal; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Currently, about </span><a href="https://data.census.gov/table/ACSST1Y2024.S1601?q=language" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">14% of the US population</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> speaks Spanish. PyCon US has proudly hosted the </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">PyCon Charlas</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, a dedicated track of talks presented entirely in Spanish, since 2018. The Charlas have been a phenomenal success, highlighting the deep well of talent within the Spanish-speaking Pythonista community across Latin America, Europe, the United States, Africa (looking at you, Equatorial Guinea), and beyond.<br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The Charlas has evolved from a small day with a handful of talks to an official track with 2 full days of talks! But we believe we could do more.</span></p><p style="font-weight: normal; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Elevating a Spanish-language presentation to the </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Keynote Stage</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> is a significant step for PyCon US for several reasons:</span></p><p style="font-weight: normal; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Reflecting our Global Community:</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Python is a truly global language, and its developer base is wonderfully diverse. By placing a Spanish-language talk on the main stage, PyCon US is reflecting the reality of our worldwide community. We want to remind folks that top-tier technical leadership and innovation happen in every language.<br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p style="font-weight: normal; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Amplifying the Charlas Track:</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Moving from the Charlas track to the Keynote stage bridges the gap between our English and Spanish programming. It exposes the broader PyCon US audience to the vibrancy of our Spanish-speaking community, and we hope it encourages more cross-cultural collaboration and networking.<br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p style="font-weight: normal; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Encourage the Spanish-speaking community</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: A few initiatives have been developed around the Python ecosystem supporting the Spanish-speaking community, like the </span><a href="https://docs.python.org/es/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">official translation of the Python documentation</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. This initiative has been adding more and more people, so if you are interested, make sure to check out the </span><a href="https://python-docs-es.readthedocs.io/es/3.14/CONTRIBUTING.html" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">contribution guide</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">! We also encourage you to check out the </span><a href="https://hablemospython.dev" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Python en Español</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> community hub, which has gathered many Spanish-speaking communities around the world. You can also come visit the Python en </span><a href="https://hablemospython.dev" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Español</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> booth in the PyCon US Expo Hall!<br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p style="font-weight: normal; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Motivating other language-focused communities:</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> If the Spanish-speaking community managed to get here, we have no doubt that in the future we could have even more languages in our beloved conference. Let us know which language you’d like to see follow these steps!</span></p></span></b></h3><h3 style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt; text-align: justify;"><span style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: arial;">Join Us for This Historic Moment</span></span></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="font-family: arial; font-size: small;"><span style="font-weight: normal;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="vertical-align: baseline;">Whether you are a native Spanish speaker, you've been practicing your </span><span style="font-style: italic; vertical-align: baseline;">español</span><span style="vertical-align: baseline;"> on some apps, or you just want to experience a fantastic technical talk through the magic of live translation and community spirit, you will not want to miss this.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="vertical-align: baseline;">So charge up your phone, pack a set of headphones so you can use the live translation service and get ready to give a massive, warm welcome to Pablo Galindo Salgado. </span><span style="font-style: italic; vertical-align: baseline;">¡Nos vemos en Long Beach!</span><span style="vertical-align: baseline;"> (See you in Long Beach!)</span></p><span style="vertical-align: baseline;">*** </span><span style="font-style: italic; vertical-align: baseline;">To learn more about Pablo and our other incredible keynote speakers, head over to the</span><a href="https://us.pycon.org/2026/about/keynote-speakers/"><span style="color: black; font-style: italic; vertical-align: baseline;"> </span><span style="color: #1155cc; font-style: italic; vertical-align: baseline;">PyCon US 2026 Keynote Speakers page</span></a><span style="font-style: italic; vertical-align: baseline;">.

</span></span><b id="docs-internal-guid-37da6964-7fff-dd90-4d50-8b5c5d6e4f60" style="font-weight: normal;"><span><a name="more"></a></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"></p><h2><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Título: ¡Haciendo historia! Celebrando la primera keynote en español de PyCon US</span></h2><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">PyCon US siempre ha sido mucho más que un lenguaje de programación; se trata de la increíble comunidad global que lo construye, lo apoya y lo impulsa. Este año, en PyCon US 2026 en Long Beach, estamos emocionados de celebrar un hito extraordinario para nuestra comunidad: ¡nuestra primera keynote en español, presentada por el brillante Pablo Galindo Salgado!</span></p><p></p></b></span></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: arial; font-size: small;">Conoce a tu keynote speaker: Pablo Galindo Salgado</span></span></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><b style="font-weight: normal;"><span style="font-family: arial; font-size: small;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si has usado Python recientemente, probablemente te has beneficiado del </span><a href="https://pablogsal.com/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">trabajo de Pablo</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Actualmente forma parte del equipo de Python en</span><a href="https://www.hudsonrivertrading.com/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"> Hudson River Trading</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y es </span><a href="https://devguide.python.org/core-team/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">desarrollador core de CPython</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Además, está cumpliendo su sexto mandato en el </span><a href="https://github.com/python/steering-council" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Python Steering Council</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y fue release manager de Python 3.10 y 3.11.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Pero su trayectoria no se limita a la ingeniería de software: ¡Pablo también es físico teórico especializado en relatividad general y física de agujeros negros! (Y sí, también tiene un gato, aunque asegura que no programa).</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Con su sólida experiencia técnica y su perspectiva científica única, Pablo está más que preparado para ofrecer una keynote inolvidable. Pero lo que hace este momento aún más especial es el idioma en el que será presentada.</span></p><p></p></span></b></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: arial; font-size: medium;">Por qué una keynote en español es importante para PyCon US</span></span></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><b style="font-weight: normal;"><span style="font-family: arial;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="font-size: small;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Actualmente, aproximadamente el </span><a href="https://data.census.gov/table/ACSST1Y2024.S1601?q=language" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">14% de la población de Estados Unidos habla español</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Desde 2018, PyCon US ha sido anfitrión de PyCon Charlas, un track dedicado completamente a presentaciones en español. Este espacio ha sido un éxito rotundo, mostrando el enorme talento de la comunidad Python hispanohablante en América Latina, Europa, Estados Unidos, África (sí, Guinea Ecuatorial 👀) y más allá.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: small;">Las Charlas han evolucionado desde un pequeño conjunto de presentaciones en un solo día hasta convertirse en un track oficial de ¡dos días completos! Pero creemos que podemos ir aún más lejos.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: small;">Llevar una presentación en español al escenario principal es un paso importante por varias razones:</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="font-size: small;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Reflejar nuestra comunidad global</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Python es un lenguaje verdaderamente global, con una comunidad diversa y vibrante. Al incluir una keynote en español, PyCon US refleja esta realidad y reconoce que la innovación y el liderazgo técnico existen en todos los idiomas.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="font-size: small;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Amplificar el track de Charlas</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Este paso conecta el track de Charlas con el escenario principal, acercando a toda la audiencia de PyCon US a la riqueza de la comunidad hispanohablante y fomentando más colaboración e intercambio cultural.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="font-size: small;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Impulsar a la comunidad hispanohablante</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Existen iniciativas dentro del ecosistema Python que apoyan a la comunidad en español, como la </span><a href="https://docs.python.org/es/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">traducción oficial de la documentación de Python</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Este esfuerzo sigue creciendo, así que si te interesa contribuir, ¡no dudes en revisar la </span><a href="https://python-docs-es.readthedocs.io/es/3.14/CONTRIBUTING.html" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">guía de contribución</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">!</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">También te invitamos a conocer el hub de </span><a href="https://hablemospython.dev" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Python en Español</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, que reúne comunidades de todo el mundo, y a visitar su booth en el Expo Hall de PyCon US.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="font-size: small;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Motivar a otras comunidades lingüísticas</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Si la comunidad hispanohablante logró este paso, estamos seguros de que en el futuro veremos más idiomas en nuestra conferencia. ¡Cuéntanos cuál te gustaría ver próximamente!</span></span></p><p style="font-size: medium;"></p></span></b></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt; text-align: justify;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: arial; font-size: medium;">Acompáñanos en este momento histórico</span></span></h3><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: justify;"><span style="font-family: arial;"><span style="font-weight: normal;"><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="vertical-align: baseline;"><span style="font-size: small;">Ya sea que hables español nativo, estés practicando con alguna app o simplemente quieras disfrutar de una excelente charla técnica con traducción en vivo y el espíritu de la comunidad, no querrás perderte este momento.</span></span></p><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="vertical-align: baseline;"><span style="font-size: small;">Carga tu teléfono, lleva tus audífonos para usar el servicio de traducción en vivo y prepárate para darle una gran bienvenida a Pablo Galindo Salgado.</span></span></p><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="vertical-align: baseline;"><span style="font-size: small;">¡Nos vemos en Long Beach!</span></span></p><p dir="ltr" style="font-size: medium; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><p dir="ltr" style="font-size: medium; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-style: italic; vertical-align: baseline;">Para conocer más sobre Pablo y otros increíbles keynote speakers, visita la página de </span><a href="https://us.pycon.org/2026/about/keynote-speakers/"><span style="color: #1155cc; font-style: italic; vertical-align: baseline;">Keynote Speakers de PyCon US 2026.</span></a></p><br /></span><span style="font-size: medium; font-weight: normal;"><span style="font-style: italic; vertical-align: baseline;"></span></span></span></h3><h2><span style="font-weight: normal;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; vertical-align: baseline;">
</span></span></h2></span></content:encoded>
	
	<dc:date>2026-04-03T21:20:39+00:00</dc:date>
	
</item>

<item rdf:about="https://realpython.com/quizzes/codex-cli/">
	<title>Real Python: Quiz: How to Add Features to a Python Project With Codex CLI</title>
	<link>https://realpython.com/quizzes/codex-cli/</link>
	
	<content:encoded><p>In this quiz, you&rsquo;ll test your understanding of <a href="https://realpython.com/codex-cli/">How to Add Features to a Python Project With Codex CLI</a>.</p>
<p>By working through this quiz, you&rsquo;ll revisit how to install, configure, and use Codex CLI to implement and refine features in a Python project using natural language prompts.</p>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-03T12:00:00+00:00</dc:date>
	
</item>

<item rdf:about="https://realpython.com/quizzes/python-class-object/">
	<title>Real Python: Quiz: Class Concepts: Object-Oriented Programming in Python</title>
	<link>https://realpython.com/quizzes/python-class-object/</link>
	
	<content:encoded><p>In this quiz, you&rsquo;ll test your understanding of
<a href="https://realpython.com/courses/python-class-object/">Class Concepts: Object-Oriented Programming in Python</a>.</p>
<p>By working through this quiz, you&rsquo;ll revisit how to define classes,
use instance and class attributes, write different types of methods,
and apply the descriptor protocol through properties.</p>
<p>You can also deepen your knowledge with the tutorial
<a href="https://realpython.com/python-classes/">Python Classes: The Power of Object-Oriented Programming</a>.</p>
        <hr />
        <p><em>[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp; sweet Python Trick delivered to your inbox every couple of days. <a href="https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer">&gt;&gt; Click here to learn more and see examples</a> ]</em></p></content:encoded>
	
	<dc:date>2026-04-03T12:00:00+00:00</dc:date>
	
</item>


</rdf:RDF>