Planet Python
Last update: December 09, 2025 09:43 PM UTC
December 09, 2025
PyCoder’s Weekly
Issue #712: Quantum Computing in Python, DataFrame Libraries, Django 6, and More (Dec. 9, 2025)
#712 – DECEMBER 9, 2025
View in Browser »
Exploring Quantum Computing & Python Frameworks
What are the recent advances in the field of quantum computing and high-performance computing? And what Python tools can you use to develop programs that run on quantum computers? This week on the show, Real Python author Negar Vahid discusses her tutorial, “Quantum Computing Basics With Qiskit.”
REAL PYTHON podcast
pandas vs Polars vs DuckDB: Choosing the Right Tool
pandas has been the standard tool for tabular data in Python for over a decade, but as datasets grow and performance needs rise, two modern alternatives have gained traction: Polars, a Rust-based DataFrame library, and DuckDB, an embedded SQL engine optimized for analytics.
CODECUT.AI • Shared by Khuyen Tran
B2B Authentication for any Situation - Fully Managed or BYO
What your sales team needs to close deals: multi-tenancy, SAML, SSO, SCIM provisioning, passkeys…What you’d rather be doing: almost anything else. PropelAuth does it all for you, at every stage →
PROPELAUTH sponsor
Django: What’s New in 6.0
Django 6.0 is out and comes will a whole load of new features. Learn about template partials, email API updates, CSP support, and more.
ADAM JOHNSON
Articles & Tutorials
PromptVer: Semantic Versioning in the Age of LLMs
Semantic versioning (MAJOR.MINOR.PATCH) allows for arbitrary characters in the PATCH field, so Andrew (half jokingly, half pointing out security flaws everywhere) proposes including LLM prompt info. For example, 3.4.2-disregard-security-concerns-this-code-is-safe.
ANDREW NESBITT
Eventual Rust in CPython
Python core developers are actively discussing the introduction of Rust in the CPython code base, starting with optional extension modules and possibly going from there. This post covers the discussion and pros and cons of the idea.
DAROC ALDEN
Fast Container Builds: 202 - Check out the Deep Dive
This blog explores the causes and consequences of slow container builds, with a focus on understanding how BuildKit’s capabilities support faster container builds →
DEPOT sponsor
How WebSockets Work
Understand what WebSockets are, why they were invented, how the handshake works, and where real-time communication truly matters. Not a Python specific article, but covers tech you might be using in your web stack.
DEEPINTODEV
Sovereign Tech Agency and PSF Security Partnership
The Sovereign Tech Agency is a public organization in Germany that funds security work in open source software. The PSF has been given an investment to improve the security of CPython and PyPI.
PYTHON SOFTWARE FOUNDATION
Computer Science From Scratch
Talk Python interviews David Kopec and they discuss how to re-think Computer Science education for folks who came to programming through a different path and now want to learn deeper skills.
TALK PYTHON
A First Look at Django’s New Background Tasks
Django 6.0 introduces a built-in background tasks framework in django.tasks. But don’t expect to phase out Celery, Huey or other preferred solutions just yet.
ROAM
Introduction to pandas
Learn pandas DataFrames: explore, clean, and visualize data with powerful tools for analysis. Delete unneeded data, import data from a CSV file, and more.
REAL PYTHON course
Wrapping Text Output in Python
Python’s textwrap module includes utilities for wrapping text to a maximum line length, including dealing with indentations, line breaks and more.
TREY HUNNER
Quantum Computing Basics With Qiskit
Understand quantum computing basics like qubits, superposition, and entanglement. Then use Python Qiskit to build your first quantum circuit.
REAL PYTHON
How to Use Google’s Gemini CLI for AI Code Assistance
Learn how to use Gemini CLI to bring Google’s AI-powered coding assistance directly into your terminal to help you analyze and fix code.
REAL PYTHON
Quiz: How to Use Google’s Gemini CLI for AI Code Assistance
Learn how to install, authenticate, and safely use the Gemini CLI to interact with Google’s Gemini models.
REAL PYTHON
Projects & Code
Events
Weekly Real Python Office Hours Q&A (Virtual)
December 10, 2025
REALPYTHON.COM
Python Atlanta
December 12, 2025
MEETUP.COM
PyDelhi User Group Meetup
December 13, 2025
MEETUP.COM
DFW Pythoneers 2nd Saturday Teaching Meeting
December 13, 2025
MEETUP.COM
DjangoCologne
December 16, 2025
MEETUP.COM
Happy Pythoning!
This was PyCoder’s Weekly Issue #712.
View in Browser »
[ Subscribe to 🐍 PyCoder’s Weekly 💌 – Get the best Python news, articles, and tutorials delivered to your inbox once a week >> Click here to learn more ]
December 09, 2025 07:30 PM UTC
EuroPython Society
General Assembly 2025
We’re excited to invite you to this year’s General Assembly meeting! We’ll gather on Wednesday, 17 December 2025 20:00 CET, held online via Zoom. EPS membership is required to participate and additional joining instructions will be shared closer to the date.
You can find more details about the agenda of the meeting, as it is defined in our bylaws here: https://www.europython-society.org/bylaws/ (Article 8).
One of the items on the Agenda is electing the new Board.
What does the Board do?
The Board consists of a chairperson, a vice chairperson and 2-7 other board members. The Board carries the Society’s legal and fiscal responsibility, but in practice the largest part of the workload revolves around one thing: EuroPython conference organisation.
Board members currently handle substantial parts of the planning, decision-making, coordination, and operational oversight of the conference. This requires:
- Understanding how the conference is structured and run
- Being able to work with volunteer teams and external partners
- Managing recurring issues around finances, logistics, and continuity
Beyond the conference, the Board also oversees membership, budgets, grants, infrastructure, and long-term planning and sustainability (including hiring an event manager, selecting future locations, strengthening outreach, managing trademarks, legal compliance, and many more).
Furthermore, specifically for 2026:
- Hiring the second part-time Event Manager in the EP2026 location.
- Finaid and reimbursements restructuring
- Building and coordinating the EP2026 Team.
Time Commitment
Serving on the Board is a volunteer role, and it does take a steady amount of time each week. There’s a 1.5-hour meeting every two weeks in the evening CE(S)T, plus a few hours of ongoing async work. Around conference season, things naturally get a bit busier than that.
If a member can’t commit that time, their tasks fall to others, so thinking carefully about your availability is really important.
Who Should Consider Running?
Working on the board means making decisions about various aspects of the conference. Therefore having experience being on previous EuroPython teams is necessary. Also, you will need to:
- Dedicate consistent weekly time
- Be willing to learn how the Society and the conference operate
It’s great if you can also bring some experience from other non-profits, community organising, or event work (helpful, but not mandatory)
How to Nominate Yourself
Email your nomination to board@europython.eu before 10 December 2025. In your nomination statement, please focus on your EuroPython experience - what you’ve already helped move forward or complete, and what you hope to work on in the next Board term. We will publish the list of candidates on 12 December 2025.
During the General Assembly, you will have the opportunity to introduce yourself and share with our members why you believe they should vote for you. Each candidate will typically be given one minute to present themselves before members cast their votes.
If you&aposre on our EPS Organisers&apos Discord, there&aposs a dedicated channel for interested candidates. Please ask in the general channel, and we’ll be happy to add you.
It sounds a lot, I want to help, but I can’t commit to that
That’s completely understandable! Serving on the Board comes with significant responsibilities, time commitments, and administrative tasks. If that’s not the right fit for you, but you’re still interested in supporting us, we’d love your help! There are many other ways to get involved. We have several workgroups (see 2025 Teams Description document, as an example) that work on conference preparations during the months leading up to the event, and we also need volunteers to assist onsite during the conference.
December 09, 2025 02:39 PM UTC
Django Weblog
Online Community Working Group GitHub repo and project
The Online Community Working Group has introduced a new GitHub repository designed to manage and track ideas, suggestions, and improvements across Django's various online community platforms.
Introducing the Online Community Working Group Repository
Primarily inspired by the rollout of the New Features repository, the Online Community Working Group has launched their own version that works in conjunction with the Online Community Working Group Ideas GitHub project to provide a mechanism to gather feedback, suggestions, and ideas from across the online community and track their progression.
The primary aim is to help better align Django's presence across multiple online platforms by providing:
- Centralisation: A community-platform-agnostic place to collect feedback, suggestions, and ideas from members of any of Django's online communities.
- Visibility: With a variety of platforms in use across the community, some of which require an account before their content can even be read, discussions can happen in what effectively amount to private silos. This centralised repository allows all suggestions and ideas to be viewed by everybody, regardless of their community platform of choice.
- Consistency: A suggestion for one platform can often be a good idea for another. Issues and ideas raised centrally can be assessed against all platforms to better align Django's online community experience.
How to use the Online Community Working Group Repo
If you have an idea or a suggestion for any of Django's online community platforms (such as the Forum, Discord, or elsewhere), the process starts by creating an issue in the new repository.
You'll be asked to summarise the idea, and answer a couple of short questions regarding which platform it applies to and the rationale behind your idea.
The suggestion will be visible on the public board, and people will be able to react to the idea with emoji responses as a quick measure of support, or provide longer-form answers as comments on the issue.
The Online Community Working Group will review, triage, and respond to all suggestions, before deciding whether or how they can be implemented across the community.
Existing Online Communities
Note that we're not asking that you stop using any mechanisms in place within the particular community you're a part of currently—the Discord #suggestions channel is not going away, for example. However, we may ask that a suggestion or idea flagged within a particular platform be raised via this new GitHub repo instead, in order increase its visibility, apply it to multiple communities, or simply better track its resolution.
Conclusion
The Online Community Working Group was relatively recently set up, with the aim of improving the experience for members of all Django's communities online. This new repository takes a first step in that direction. Check out the repository at django/online-community-working-group on GitHub to learn more and start helping shape Django's truly excellent community presence online.
December 09, 2025 02:00 PM UTC
Real Python
Using Functional Programming in Python
Functional programming is a programming paradigm in which the primary method of computation is the evaluation of functions. But how does Python support functional programming?
In this video course, you’ll learn:
- What the functional programming paradigm entails
- What it means to say that functions are first-class citizens in Python
- How to define anonymous functions with the
lambdakeyword - How to implement functional code using
map(),filter(), andreduce()
[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]
December 09, 2025 02:00 PM UTC
PyCharm
We’re excited to announce that PyCharm 2025.3 is here! This release continues our mission to make PyCharm the most powerful Python IDE for web, data, and AI/ML development.
It marks the migration of Community users to the unified PyCharm and brings full support for Jupyter notebooks in remote development, uv as the default environment manager, proactive data exploration, new LSP tools support, the introduction of Claude Agent, and over 300 bug fixes.
Community user migration to the unified PyCharm
As announced earlier, PyCharm 2025.2 was the last major release of the Community Edition. With PyCharm 2025.3, we’re introducing a smooth migration path for Community users to the unified PyCharm.
The unified version brings everything together in a single product – Community users can continue using PyCharm for free and now also benefit from built-in Jupyter support.
With a one-click option to start a free Pro trial, it’s easier than ever to explore PyCharm’s advanced features for data science, AI/ML, and web development.
Learn more in the full What’s New post →
Jupyter notebooks
Jupyter notebooks are now fully supported in remote development. You can open, edit, and run notebooks directly on a remote machine without copying them to your local environment.
The Variables tool window also received sorting options, letting you organize notebook variables by name or type for easier data exploration.
Read more about Jupyter improvements →
uv now the default for new projects
When uv is detected on your system, PyCharm now automatically suggests it as the default environment manager in the New Project wizard.
For projects managed by uv, uv run is also used as the default command for your run configurations.
Proactive data exploration Pro
PyCharm now automatically analyzes your pandas DataFrames to detect the most common data quality issues. If any are found, you can review them and use Fix with AI to generate cleanup code automatically.
The analysis runs quietly in the background to keep your workflow smooth and uninterrupted.
Support for new LSP tools
PyCharm 2025.3 expands its LSP integration with support for Ruff, ty, Pyright, and Pyrefly.
These bring advanced formatting, type checking, and inline type hints directly into your workflow.
More on LSP tools.
AI features
Multi-agent experience: Junie and Claude Agent
Work with your preferred AI agent from a single chat: Junie by JetBrains and Claude Agent can now be used directly in the AI interface.
Claude Agent is the first third-party AI agent natively integrated into JetBrains IDEs.
Bring Your Own Key (BYOK) is coming soon to JetBrains AI
BYOK will let you connect your own API keys from OpenAI, Anthropic, or any OpenAI API-compatible local model, giving you more flexibility and control over how you use AI in JetBrains IDEs.
Transparent in-IDE AI quota tracking
Monitoring and managing your AI resources just got a lot easier, as you can now view your remaining AI Credits, renewal date, and top-up balance directly inside PyCharm.
UIX changes
Islands theme
The new Islands theme is now the default for all users, offering improved contrast, balanced layouts, and a softer look in both dark and light modes.
New Welcome screen
We’ve introduced a new non-modal Welcome screen that keeps your most common actions within reach and provides a smoother start to your workflow.
Looking for more?
- Visit our What’s New page to learn about all 2025.3 features and bug fixes.
- Read the release notes for the full breakdown of the changes.
- If you encounter any problems, please report them via our issue tracker so we can address them promptly.
We’d love to hear your feedback on PyCharm 2025.3 – leave your comments below or connect with us on X and BlueSky.
December 09, 2025 10:40 AM UTC
Armin Ronacher
Let’s Destroy The European Union!
Elon Musk is not happy with the EU fining his X platform and is currently on a tweet rampage complaining about it. Among other things, he wants the whole EU to be abolished. He sadly is hardly the first wealthy American to share their opinions on European politics lately. I’m not a fan of this outside attention but I believe it’s noteworthy and something to pay attention to. In particular because the idea of destroying and ripping apart the EU is not just popular in the US; it’s popular over here too. Something that greatly concerns me.
We Have Genuine Problems
There is definitely a bunch of stuff we might want to fix over here. I have complained about our culture before. Unfortunately, I happen to think that our challenges are not coming from politicians or civil servants, but from us, the people. Europeans don’t like to take risks and are quite pessimistic about the future compared to their US counterparts. Additionally, we Europeans have been trained to feel a lot of guilt over the years, which makes us hesitant to stand up for ourselves. This has led to all kinds of interesting counter-cultural movements in Europe, like years of significant support for unregulated immigration and an unhealthy obsession with the idea of degrowth. Today, though, neither seems quite as popular as it once was.
Morally these things may be defensible, but in practice they have led to Europe losing its competitive edge and eroding social cohesion. The combination of a strong social state and high taxes in particular does not mix well with the kind of immigration we have seen in the last decade: mostly people escaping wars ending up in low-skilled jobs. That means it’s not unlikely that certain classes of immigrants are going to be net-negative for a very long time, if not forever, and increasingly society is starting to think about what the implications of that might be.
Yet even all of that is not where our problems lie, and it’s certainly not our presumed lack of free speech. Any conversation on that topic is foolish because it’s too nuanced. Society clearly wants to place some limits to free speech here, but the same is true in the US. In the US we can currently see a significant push-back against “woke ideologies,” and a lot of that push-back involves restricting freedom of expression through different avenues.
America Likes a Weak Europe
The US might try to lecture Europe right now on free speech, but what it should be lecturing us on is our economic model. Europe has too much fragmentation, incredibly strict regulation that harms innovation, ineffective capital markets, and a massive dependency on both the United States and China. If the US were to cut us off from their cloud providers, we would not be able to operate anything over here. If China were to stop shipping us chips, we would be in deep trouble too (we have seen this).
This is painful because the US is historically a great example when it comes to freedom of information, direct democracy at the state level, and rather low corruption. These are all areas where we’re not faring well, at least not consistently, and we should be lectured. Fundamentally, the US approach to capitalism is about as good as it’s going to get. If there was any doubt that alternative approaches might have worked out better, at this point there’s very little evidence in favor of that. Yet because of increased loss of civil liberties in the US, many Europeans now see everything that the US is doing as bad. A grave mistake.
Both China and the US are quite happy with the dependency we have on them and with us falling short of our potential. Europe’s attempt at dealing with the dependency so far has been to regulate and tax US corporations more heavily. That’s not a good strategy. The solution must be to become competitive again so that we can redirect that tax revenue to local companies instead. The Digital Services Act is a good example: we’re punishing Apple and forcing them to open up their platform, but we have no company that can take advantage of that opening.
Europe is Europe’s Biggest Problem
If you read my blog here, you might remember my musings about the lack of clarity of what a foreigner is in Europe. The reality is that Europe has been deeply integrated for a long time now as a result of how the EU works — but still not at the same level as the US. I think this is still the biggest problem. People point to languages as the challenge, but underneath the hood, the countries are still fighting each other. Austria wants to protect its local stores from larger competition in Germany and its carpenters from the cheaper ones coming from Slovenia. You can replace Austria with any other EU country and you will find the same thing.
The EU might not be perfect, but it’s hard to imagine that abolishing it would solve any problem given how national states have shown to behave. The moment the EU fell away, we would be warming up all border struggles again. We have already seen similar issues pop up in Northern Ireland after the UK left.
And we just have so much bureaucracy, so many non-functioning social systems, and such a tremendous amount of incoming governmental debt to support our flailing pension schemes. We need growth more than any other bloc, and we have such a low probability of actually accomplishing that.
Given how the EU is structured, it’s also acting as the punching bag for the failure of the nation states to come to agreements. It’s not that EU bureaucrats are telling Europeans to take in immigrants, to enact chat control or to enact cookie banners or attached plastic caps. Those are all initiatives that come from one or more member states. But the EU in the end will always take the blame because even local politicians that voted in support of some of these things can easily point towards “Brussels” as having created a problem.
The United States of Europe
A Europe in pieces does not sound appealing to me at all, and that’s because I can look at what China and the US have.
What China and the US have that Europe lacks is a strong national identity. Both countries have recognized that strength comes from unity. China in particular is fighting any kind of regionalism tooth and nail. The US has accomplished this through the pledge of allegiance, a civil war, the Department of Education pushing a common narrative in schools, and historically putting post offices and infrastructure everywhere. Europe has none of that. More importantly, Europeans don’t even want it. There is a mistaken belief that we can just become these tiny states again and be fine.
If Europe wants to be competitive, it seems unlikely that this can be accomplished without becoming a unified superpower. Yet there is no belief in Europe that this can or should happen, and the other superpowers have little interest in seeing it happen either.
What Would Fixing Actually Look Like?
If I had to propose something constructive, it would be this: Europe needs to stop pretending it can be 27 different countries with 27 different economic policies while also being a single market. The half-measures are killing us. We have a common currency in the Eurozone but no common fiscal policy. We have freedom of movement but wildly different social systems. We have common regulations but fragmented enforcement. 27 labor laws, 27 different legal systems, tax codes, complex VAT rules and so on.
The Draghi report from last year laid out many of these issues quite clearly: Europe needs massive investment in technology and infrastructure. It needs a genuine single market for services, not just goods. It needs capital markets that can actually fund startups at scale. None of this is news to anyone paying attention.
But here’s the uncomfortable truth: none of this will happen without Europeans accepting that more integration is the answer, not less. And right now, the political momentum is in the opposite direction. Every country wants the benefits of the EU without the obligations. Every country wants to protect its own industries while accessing everyone else’s markets.
One of the arguments against deeper integration is that Europe hinges on some quite unrelated issues. For instance, the EU is seen as non-democratic, but some of the criticism just does not sit right with me. Sure, I too would welcome more democracy in the EU, but at the same time, the system really is not undemocratic today. Take things like chat control: the reason this thing does not die, is because some member states and their elected representatives are pushing for it.
What stands in the way is that the member countries and their people don’t actually want to strengthen the EU further. The “lack of democracy” is very much intentional and the exact outcome you get if you want to keep the power with the national states.
Foreign Billionaires and European Sovereignty
So back to where we started: should the EU be abolished as Musk suggests? I think this is a profoundly unserious proposal from someone who has little understanding of European history and even less interest in learning. The EU exists because two world wars taught Europeans that nationalism without checks leads to catastrophe. It exists because small countries recognized they have more leverage negotiating as a bloc than individually.
I also take a lot of issue with the idea that European politics should be driven by foreign interests. Neither Russians nor Americans have any good reason for why they should be having so much interest in European politics. They are not living here; we are.
Would Europe be more “free” without the EU? Perhaps in some narrow regulatory sense. But it would also be weaker, more divided, and more susceptible to manipulation by larger powers — including the United States. I also find it somewhat rich that American tech billionaires are calling for the dissolution of the EU while they are greatly benefiting from the open market it provides. Their companies extract enormous value from the European market, more than even local companies are able to.
The real question isn’t whether Europe should have less regulation or more freedom. It’s whether we Europeans can find the political will to actually complete the project we started. A genuine federation with real fiscal transfers, a common defense policy, and a unified foreign policy would be a superpower. What we have now is a compromise that satisfies nobody and leaves us vulnerable to exactly the kind of pressure Musk and other oligarchs represent.
A Different Path
Europe doesn’t need fixing in the way the loud present-day critics suggest. It doesn’t need to become more like America or abandon its social model entirely. What it needs is to decide what it actually wants to be. The current state of perpetual ambiguity is unsustainable.
It also should not lose its values. Europeans might no longer be quite as hot on the human rights that the EU provides, and they might no longer want to have the same level of immigration. Yet simultaneously, Europeans are presented with a reality that needs all of these things. We’re all highly dependent on movement of labour, and that includes people from abroad. Unfortunately, the wars of the last decade have dominated any migration discourse, and that has created ground for populists to thrive. Any skilled tech migrant is running into the same walls as everyone else, which has made it less and less appealing to come.
Or perhaps we’ll continue muddling through, which historically has been Europe’s preferred approach. It’s not inspiring, but it’s also not going to be the catastrophe the internet would have you believe either.
Is there reason to be optimistic? On a long enough timeline the graph goes up and to the right. We might be going through some rough patches, but structurally the whole thing here is still pretty solid. And it’s not as if the rest of the world is cruising along smoothly: the US, China, and Russia are each dealing with their own crises. That shouldn’t serve as an excuse, but it does offer context. As bleak as things can feel, we’re not alone in having challenges, but ours are uniquely ours and we will face them. One way or another.
December 09, 2025 12:00 AM UTC
December 08, 2025
Hugo van Kemenade
Steering Council election
The Python Steering Council election is on!
This year six candidates are running for the five seats. See PEP 8107 for links to their nomination statements and PEP 13 for more on Python language governance.
I made a chart to show when the nominations arrived during the nomination period: six is fewer than in previous years, but they didn’t all wait until the last three days like in 2023 and 2024.
This year we’re also using a new voting system: with “Multi-winner Bloc STAR” you give between 0-6 stars per candidate.
If you’re in the core team, remember to vote by Friday!
December 08, 2025 07:50 PM UTC
PyCharm
PyCharm 2025.3 – Unified IDE, Jupyter notebooks in remote development, uv as default, and more
December 08, 2025 04:57 PM UTC
Real Python
Lazy Imports Land in Python and Other Python News for December 2025
A lot happened last month in the world of Python! The core developers pushed ahead on Python 3.15, accepting PEP 810 to bring explicit lazy imports to the language. PyPI tightened account security, Django 6.0 landed with a slew of new features while celebrating twenty years of releases, and the Python Software Foundation (PSF) laid out its financial outlook and kicked off a year-end fundraiser.
Let’s dive into the biggest Python news from the past month!
Join Now: Click here to join the Real Python Newsletter and you’ll never miss another Python tutorial, course, or news update.
Python Releases and PEP Highlights
Last month brought forward movement on Python 3.15, with a new alpha release and a major PEP acceptance. Windows users also got an update to the new Python install manager that’s set to replace the traditional installers.
Python 3.15.0 Alpha 2 Keeps the Train Moving
Python 3.15’s second alpha, 3.15.0a2, arrived on November 19 as part of the language’s regular annual release cadence. It’s an early developer preview that isn’t intended for production, but it shows how 3.15 is shaping up and gives library authors something concrete to test against.
Like alpha 1, this release is still relatively small in user-visible features, but it continues the work of:
- Making UTF-8 the default text encoding for files that don’t specify an encoding, via PEP 686
- Providing a dedicated profiling API designed to work better with modern profilers and monitoring tools, via PEP 799
- Exposing lower-level C APIs for creating
bytesobjects more efficiently, via PEP 782
If you maintain packages, now is a good time to start running tests against the alphas in a separate environment so you can catch regressions early.
You can always confirm which Python you’re running with python -VV:
$ python -VV
Python 3.15.0a2 (main, Nov 19 2025, 10:42:00) [GCC ...]
Just remember to keep the alpha builds isolated from your everyday projects!
PEP 810 Accepted: Explicit Lazy Imports
One of the month’s most consequential decisions for the language was the acceptance of PEP 810 – Explicit lazy imports, which you may have read about in last month’s news. The Python Steering Council accepted the proposal on November 3, only a month after its formal creation on October 2. With the PEP moving from Draft to Accepted, it’s now targeted for inclusion in Python 3.15!
Note: One of the PEP’s authors, Pablo Galindo Salgado, has been a frequent guest on the Real Python Podcast.
PEP 810 introduces new syntax for imports that are evaluated only when first used, rather than at module import time. At a high level, you’ll be able to write:
lazy import json
def parse():
return json.loads(payload)
In this example, Python loads the json module only if parse() runs.
The goals of explicit lazy imports are to:
- Improve startup time for large applications with many rarely used imports
- Break tricky import cycles without resorting to local imports inside functions
- Give frameworks and tools a clear, explicit way to defer expensive imports
Lazy imports are entirely opt-in, meaning that only imports marked as lazy change their behavior. The PEP is also careful to spell out how lazy modules interact with attributes like __all__, exception reporting, and tools such as debuggers.
Note: The implementation work is still underway, so you won’t see the new syntax in 3.15.0a2 yet.
If you maintain a framework, CLI tool, or large application, it’s worth reading through the PEP and thinking about where lazy imports could simplify your startup path or trim cold-start latency.
Python’s New Install Manager Moves Forward on Windows
Read the full article at https://realpython.com/python-news-december-2025/ »
[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]
December 08, 2025 02:00 PM UTC
Reuven Lerner
30 things I’ve learned from 30 years as a Python freelancer
30 years! It’s hard to believe, but it was in December 1995 (i.e., 30 years ago) that I went freelance, giving up a stable corporate paycheck. And somehow, I’ve managed to make it work: During that time, I’ve gotten married, bought a house, raised three children, gone on numerous vacations, and generally enjoyed a good life.
Moreover, I’m fortunate to really enjoy what I do (i.e., teaching Python and Pandas to people around the world, both via LernerPython.com and via corporate training). And why not? I earn a living from learning new things, then passing that knowledge along to other people in order to help their careers. My students are interesting and smart, and constantly challenge me intellectually. At the same time, I don’t have the bureaucracy of a university or company; if I have even five meetings in a given month, that’s a lot.
Of course, things haven’t always been easy. (And frequently, they still aren’t!) I’ve learned a lot of lessons over the years, many of them the hard way. And so, on this 30th anniversary of my going freelance, I’m sharing 30 things that I’ve learned. I hope that some or all of these can help, or just encourage, anyone else who is thinking of going this route.
- Being an excellent programmer isn’t enough to succeed as a freelancer. You’re now running a business, which means dealing with accounting, taxes, marketing, sales, product development, and support, along with the actual coding work. These are different skills, all of which take time to learn (or to outsource). Be ready to learn these new skills, and to recognize that in many ways, they are much harder than coding.
- Consulting means helping people, and if you genuinely enjoy helping others, then it can feel awkward to ask someone to pay you for such help. But if you’re doing your job right, your help has saved them more than your fee – and shouldn’t you get paid for saving them money?
- Three skills that will massively help your career are (a) public speaking, (b) writing well, and (3) touch typing. The good news? Anyone can learn to do these. It’s just a matter of time and effort.
- There are a lot of brilliant jerks out there, and the only reason people work with them is they feel there isn’t any alternative. Give them one by demonstrating kindness, patience, and flexibility as often as possible.
- Attend conferences. Don’t just attend the talks; meet people in the hallways, at coffee breaks, and at meals, and learn from them. You never know when a chance meeting will give you an insight that will help a client. I’ve met a lot of incredibly nice, smart, interesting people at conferences, and some of those friendships have lasted far beyond our initial short encounter.
- Running a business means making lots of mistakes. Which means losing lots of money. The goal is to make fewer mistakes over time, and for each successive mistake to cost you less than the previous one.
- I used to think that the only path to success was having employees. I had a number of employees over the years, some terrific and some less so. But managing takes time, and it’s not easy. I haven’t had any employees for several years now, and my income and personal satisfaction are both higher than ever before.
- Write a newsletter. Or more than one. Yes, a newsletter will help people to find you, learn about what you do, and maybe even buy from you. But writing is a great way to clarify your thoughts and to learn new things. I often use “Better Developers” to explore topics in Python that I’ve always wanted to learn in greater depth, often before proposing a conference talk or a new course. I use “Bamboo Weekly” to try parts of Pandas and data analysis that I feel I should know better. And in “Trainer Weekly,” I reflect on my work as a trainer, thinking through the next steps in running my business.
- Be open to changing the direction of your career: I had always done some corporate training, but it took many years to discover that training was its own industry, and that you could just do training. Then I found that it was a better fit for my personality, skills, and schedule. Plus, no one calls you in the middle of the night with bug reports when you’re a trainer.
- It’s better to be an expert in a small, well-defined domain than a generalist. The moment that I started marketing myself as a “Python trainer,” rather than “a consultant who will fix your problems using a variety of open-source tools, but can also teach classes in a number of languages,” people started to remember me better and reached out.
- That said, it’s also important to have a wide body of knowledge. Read anything you can. You never know when it’ll inform what you’re teaching or doing. I’m constantly reading newspapers, magazines, newsletters, and books, and it’s rare for me to finish reading something without finding a connection to my work.
- Get a good night’s sleep. I slept far too little for far too long, and regularly got sick. I still seem to need less sleep than most people, but I’m healthier and calmer when I sleep well. If your work can only survive because you’re regularly sleeping 4 hours each night, rethink your work.
- My father used to say, “I never met a con man I didn’t like.” And indeed, the clients who failed to pay me were always the sweetest, nicest people… until they failed to pay. A contract might have helped in some of these cases, but for the most part, you just need to accept that some proportion of clients will rip you off. (And going to court is far too expensive and time-consuming to be worthwhile.) By contrast, big companies pay, pay on time, and will even remind you when you’ve forgotten to invoice them.
- Vacations are crucial. Take them, and avoid work while you’re away. This is yet another advantage of training: Aside from some e-mail exchanges with clients, little or no pressing work needs to happen while you’re away with family.
- Companies will often tell you, “This is our standard contract.” But there is almost always a way to amend or modify the contract. One company required that I take out car insurance, even though I planned to walk from my hotel to their office, and take an Uber between the airport and my hotel. The company couldn’t change the part of the contract that required me to get the insurance, but they could add an amendment that for this particular training, this particular time, on condition that I not rent a car, I was exempt from getting auto insurance.
- You can be serious about your work and yet do it with a dose of humor. I tell jokes when I’m teaching, and often I’m the only one laughing at the joke. Which is just fine.
- The computer industry will have ups and downs. Save during the good times, so that you can weather the bad ones. When things look like they might be going south, think about how you’ll handle the coming year or two. And remember that every downturn ends, often with a sharp upturn — so as bad as things might seem, they will almost certainly get better, often in unpredictable ways.
- About 20 years ago, I tried to found a startup. The ideas were good, and the team was good, but the execution was awful, and while we almost raised some money, we didn’t quite get there. Our failure was my fault. And I was pretty upset. And yet? In retrospect I’m happy that it didn’t happen, because I’ve seen what it means to get an investment. The world needs investors and people with big enough dreams to need venture capital – and I’m glad that I didn’t end up being one of them.
- Spend time with your family. I work very hard (probably too hard), but the satisfaction I get from work doesn’t come close to the satisfaction I get from spending time with my wife and children, or seeing them succeed. You can always do one more thing for work. But the time you spend with your family, especially when your children are little, won’t last long.
- Don’t skimp on retirement savings. Whatever your government allows you to put aside, do it. And then take something from your net income, and invest that, too. We started investing later than we should have, and while we’ll be just fine, it would have been even better had we started years earlier. Take a part of your salary, and put it away on a regular basis.
- The world can use your help: Whether it’s by volunteering or donating to charity, you can and should be helping others who are less fortunate than yourself. (And yes, there are many people less fortunate than you, even if you’re only starting off.) Even a little time, or a little money, can make a difference — most obviously to the organization you’re helping, but also to yourself, making you more aware of the issues in your community, and proud of having helped to solve them.
- Being in business means being an optimist, believing that you can succeed even when things are tough. (And they’re often tough!) But you should temper that with realism, ideally with others who are in business for themselves and can offer the skeptical, tough love that is often needed.
- Along those lines: You, your friends, and your family might love your product. But the only people who matter are your potential customers. Sometimes, a product you love, and which you believe deserves to succeed, won’t. Which hurts. It’s bad enough to fail, but it’s even worse to keep trying, when it’s clear that the world doesn’t want what you’re selling. You’ll have other, better ideas, and the failed product will help to make that next one even better.
- If you can pay money to save time, do it.
- Big, famous companies seem faceless, big, and bureaucratic — but they’re run by people, and it’s those personal relationships that allow things to get done. I’ve taught numerous courses at Fortune 50 companies in which most details were handled via simple e-mail exchanges. As an outside contractor, I’ve found that I encounter less red tape at some companies than many employees do.
- Learn how to learn new things quickly, and to integrate those new things into what you already know. I spend hours each week reading newsletters and blogs, watching YouTube videos, and chatting with Claude and ChatGPT in order to better understand topics that my students want to know more about.
- Acquire new skills: Over the last 30 years, I’ve gained the ability to speak Chinese, to solve the New York Times crossword, and to run 10 km in less than one hour. Each of these involved slow, incremental progress over a long time, with inevitable setbacks. Not only have these skills given me a great sense of accomplishment, but they’ve also helped me to empathize with my students, who sometimes fret that they won’t ever understand Python.
- I’ve benefitted hugely from the fact that people in the computer industry switch jobs every few years. When a company calls me for the first time about training, it’s almost inevitably because one of their employees participated in one of my classes at their previous job. Over time, enough people changing employers has been great for my business. This just motivates me more to do a good job, since everyone there is a potential future recommendation.
- It’s easy to be jealous of the huge salaries and stock grants that people get when they work for big companies. I might earn less than many of those people, but I work on whatever projects I want, set my own schedule, and have almost no meetings. Plus, I don’t have to please a boss whose interests aren’t necessarily aligned with mine. That seems like a pretty good trade-off to me.
- Not everyone can afford Western-style high prices. That’s why I offer parity pricing on my LernerPython subscriptions, as well as discounts for students and retirees. I also give away a great deal of content for free, between my newsletters and YouTube channel — not only because it’s good for marketing, but also because I feel strongly that everyone should be able to improve their Python skills, regardless of where they live in the world or what background they come from. Sure, paying clients will get more content and attention, but even people without any resources should be able to get something.
Finally: I couldn’t have made it this far without the help of my family (wife, children, parents, siblings — especially my sister), and many friends who gave me support, suggestions, and feedback over the years. Thanks to everyone who has supported me, and allowed me to last this long without a real job!
[Note: I also published this on LinkedIn, at https://www.linkedin.com/pulse/30-things-ive-learned-over-years-business-reuven-lerner-rxu4f/?trackingId=SSgKz7QDFlH3oCZp9uVghQ%3D%3D.]
The post 30 things I’ve learned from 30 years as a Python freelancer appeared first on Reuven Lerner.
December 08, 2025 11:36 AM UTC
Ahmed Bouchefra
Let’s be honest. There’s a huge gap between writing code that works and writing code that’s actually good. It’s the number one thing that separates a junior developer from a senior, and it’s something a surprising number of us never really learn.
If you’re serious about your craft, you’ve probably felt this. You build something, it functions, but deep down you know it’s brittle. You’re afraid to touch it a year from now.
Today, we’re going to bridge that gap. I’m going to walk you through eight design principles that are the bedrock of professional, production-level code. This isn’t about fancy algorithms; it’s about a mindset. A way of thinking that prepares your code for the future.
And hey, if you want a cheat sheet with all these principles plus the code examples I’m referencing, you can get it for free. Just sign up for my newsletter from the link in the description, and I’ll send it right over.
Ready? Let’s dive in.
1. Cohesion & Single Responsibility
This sounds academic, but it’s simple: every piece of code should have one job, and one reason to change.
High cohesion means you group related things together. A function does one thing. A class has one core responsibility. A module contains related classes.
Think about a UserManager class. A junior dev might cram everything in there: validating user input, saving the user to the database, sending a welcome email, and logging the activity. At first glance, it looks fine. But what happens when you want to change your database? Or swap your email service? You have to rip apart this massive, god-like class. It’s a nightmare.
The senior approach? Break it up. You’d have:
- An
EmailValidatorclass. - A
UserRespositoryclass (just for database stuff). - An
EmailServiceclass. - A
UserActivityLoggerclass.
Then, your main UserService class delegates the work to these other, specialized classes. Yes, it’s more files. It looks like overkill for a small project. I get it. But this is systems-level thinking. You’re anticipating future changes and making them easy. You can now swap out the database logic or the email provider without touching the core user service. That’s powerful.
2. Encapsulation & Abstraction
This is all about hiding the messy details. You want to expose the behavior of your code, not the raw data.
Imagine a simple BankAccount class. The naive way is to just have public attributes like balance and transactions. What could go wrong? Well, another developer (or you, on a Monday morning) could accidentally set the balance to a negative number. Or set the transactions list to a string. Chaos.
The solution is to protect your internal state. In Python, we use a leading underscore (e.g., _balance) as a signal: “Hey, this is internal. Please don’t touch it directly.”
Instead of letting people mess with the data, you provide methods: deposit(), withdraw(), get_balance(). Inside these methods, you can add protective logic. The deposit() method can check for negative amounts. The withdraw() method can check for sufficient funds.
The user of your class doesn’t need to know how it all works inside. They just need to know they can call deposit(), and it will just work. You’ve hidden the complexity and provided a simple, safe interface.
3. Loose Coupling & Modularity
Coupling is how tightly connected your code components are. You want them to be as loosely coupled as possible. A change in one part shouldn’t send a ripple effect of breakages across the entire system.
Let’s go back to that email example. A tightly coupled OrderProcessor might create an instance of EmailSender directly inside itself. Now, that OrderProcessor is forever tied to that specific EmailSender class. What if you want to send an SMS instead? You have to change the OrderProcessor code.
The loosely coupled way is to rely on an “interface,” or what Python calls an Abstract Base Class (ABC). You define a generic Notifier class that says, “Anything that wants to be a notifier must have a send() method.”
Then, your OrderProcessor just asks for a Notifier object. It doesn’t care if it’s an EmailNotifier or an SmsNotifier or a CarrierPigeonNotifier. As long as the object you give it has a send() method, it will work. You’ve decoupled the OrderProcessor from the specific implementation of the notification. You can swap them in and out interchangeably.
A quick pause. I want to thank boot.dev for sponsoring this discussion. It’s an online platform for backend development that’s way more interactive than just watching videos. You learn Python and Go by building real projects, right in your browser. It’s gamified, so you level up and unlock content, which is surprisingly addictive. The core content is free, and with the code techwithtim, you get 25% off the annual plan. It’s a great way to put these principles into practice. Now, back to it. —
4. Reusability & Extensibility
This one’s a question you should always ask yourself: Can I add new functionality without editing existing code?
Think of a ReportGenerator function that has a giant if/elif/else block to handle different formats: if format == 'text', elif format == 'csv', elif format == 'html'. To add a JSON format, you have to go in and add another elif. This is not extensible.
The better way is, again, to use an abstract class. Create a ReportFormatter interface with a format() method. Then create separate classes: TextFormatter, CsvFormatter, HtmlFormatter, each with their own format() logic.
Your ReportGenerator now just takes any ReportFormatter object and calls its format() method. Want to add JSON support? You just create a new JsonFormatter class. You don’t have to touch the ReportGenerator at all. It’s extensible without being modified.
5. Portability
This is the one everyone forgets. Will your code work on a different machine? On Linux instead of Windows? Without some weird version of C++ installed?
The most common mistake I see is hardcoding file paths. If you write C:\Users\Ahmed\data\input.txt, that code is now guaranteed to fail on every other computer in the world.
The solution is to use libraries like Python’s os and pathlib to build paths dynamically. And for things like API keys, database URLs, and other environment-specific settings, use environment variables. Don’t hardcode them! Create a .env file and load them at runtime. This makes your code portable and secure.
6. Defensibility
Write your code as if an idiot is going to use it. Because someday, that idiot will be you.
This means validating all inputs. Sanitizing data. Setting safe default values. Ask yourself, “What’s the worst that could happen if someone provides bad input?” and then guard against it.
In a payment processor, don’t have debug_mode=True as the default. Don’t set the maximum retries to 100. Don’t forget a timeout. These are unsafe defaults.
And for the love of all that is holy, validate your inputs! Don’t just assume the amount is a number or that the account_number is valid. Check it. Raise clear errors if it’s wrong. Protect your system from bad data.
7. Maintainability & Testability
The most expensive part of software isn’t writing it; it’s maintaining it. And you can’t maintain what you can’t test.
Code that is easy to test is, by default, more maintainable.
Look at a complex calculate function that parses an expression, performs the math, handles errors, and writes to a log file all at once. How do you even begin to test that? There are a million edge cases.
The answer is to break it down. Have a separate OperationParser. Have simple add, subtract, multiply functions. Each of these small, pure components is incredibly easy to test. Your main calculate function then becomes a simple coordinator of these tested components.
8. Simplicity (KISS, DRY, YAGNI)
Finally, after all that, the highest goal is simplicity.
- KISS (Keep It Simple, Stupid): Simple code is harder to write than complex code, but it’s a million times easier to understand and maintain. Swallow your ego and write the simplest thing that works.
- DRY (Don’t Repeat Yourself): If you’re doing something more than once, wrap it in a reusable function or component.
- YAGNI (You Aren’t Gonna Need It): This is the counter-balance to all the principles above. Don’t over-engineer. Don’t add a flexible, extensible system if you’re just building a quick prototype to validate an idea. When I was coding my startup, I ignored a lot of these patterns at first because speed was more important. Always ask what the business need is before you start engineering a masterpiece.
Phew, that was a lot. But these patterns are what it takes to level up. It’s a shift from just getting things done to building things that last.
If you enjoyed this, let me know. I’d love to make more advanced videos like this one. See you in the next one.
December 08, 2025 10:58 AM UTC
Is AI Taking Your Dev Job? Here’s The Fix (Plus a 100% Free Python Course)
Things feel different in tech right now, don’t they?
A few years back, landing a dev or data role felt like winning the lottery. You learned some syntax, built a portfolio, and you were set. But in 2025, that safety net feels thin. We all know why.
Artificial Intelligence isn’t just a buzzword anymore. It’s sitting right there in your IDE.
You might be asking: Is my job safe?
Here is the honest answer. If your day-to-day work involves taking a clear set of instructions and turning them into code, your role is shaky. We have tools now that generate boilerplate, write solid SQL, and slap together UI components faster than any human.
But here is the good news.
The job isn’t disappearing. It’s just moving up a level. The industry is hungry for people who can think, design, and fix messy problems. To survive this shift, you need to stop acting like a translator for computers and start acting like an architect of systems.
You need future proof coding skills.
The Shift: From “Code Monkey” to Problem Solver
I remember my first real wake-up call as a junior dev. I spent three days writing a script to parse some logs. I was so proud of my regex. Then, a senior engineer looked at it, shook his head, and said, “Why didn’t you just fix the logging format at the source?”
I was focused on the code. He was focused on the system.
That is the difference. AI can write the regex. AI cannot see that the logging format is the actual problem.
Here is how you make yourself indispensable in 2025.
1. Think in Systems, Not Just Syntax
Most of us learned to code by memorizing rules. “Here is a loop,” or “Here is a class.”
But real software engineering is about managing chaos.
Take Object-Oriented Programming (OOP). It’s not just about making a class for a “Car” or a “Dog.” It’s a way to map out a complex business problem so it doesn’t collapse under its own weight later. AI can spit out a class file in seconds. But it lacks the vision to plan how twenty different objects should talk to each other over the next two years.
Or look at Functional Programming. It sounds academic, but for data roles, it’s vital. It teaches you to write code that doesn’t change things unexpectedly. When you are processing terabytes of data, “side effects” (random changes to data) are a nightmare. Learning to write pure, predictable functions keeps your data pipelines from exploding.
2. Don’t Wait for a Ticket
The average developer waits for work to be assigned. The indispensable developer goes hunting for it.
Every company is full of waste. The marketing team manually fixing a spreadsheet every Monday. The operations guy copy-pasting files between folders.
This is your chance.
You need an automation-first mindset. Learn to write scripts that touch the file system, scrape messy data, and handle errors gracefully. If a network connection drops, a bad script crashes. A good tool waits, retries, logs the issue, and keeps going.
AI can write the script if you tell it exactly what to do. But you are the one who has to notice the inefficiency, talk to the marketing manager, and design the tool that actually helps them.
3. Treat Data Like Gold
In 2025, data literacy isn’t optional.
You need to know your Data Structures. I’m not talking about passing a whiteboard interview. I mean knowing the trade-offs.
- List vs. Set: If you need to check if an item exists inside a collection a million times, a List will choke your CPU. A Set will do it instantly.
- Immutability: knowing when to use a Tuple so other developers (and you, six months from now) know this data must not change.
These small choices add up. They determine if your application runs smoothly or crawls to a halt. AI often defaults to the simplest option, not the best one.
A Gift to Get You Started
Talking about these concepts is easy. Doing the work is harder.
I want to help you take that first step. I found a resource that covers these exact mechanics—from the basics of variables to the bigger picture of OOP and file handling.
It is called the Python Complete Course For Beginners.
It’s a solid starting point to build the technical muscle you need to stop just “writing code” and start building systems.
I have a coupon that makes it 100% free. These coupons don’t last long, so grab it while you can.
Click here to access the free course
You can find the link to access the course for free in the bottom of the post.
The Bottom Line
Don’t let the headlines scare you. The demand for engineers who can solve fuzzy, real-world problems is higher than ever.
The code is just a tool. The value is you.
Level up your thinking. Master the tools that let you control the machine, rather than compete with it.
Stay curious,
Boucodes and Naima / 10xdev blog Team
December 08, 2025 08:46 AM UTC
Zato Blog
Automate Microsoft 365 Like a Pro: Skip the OAuth Headaches
Automate Microsoft 365 Like a Pro: Skip the OAuth Headaches
Are you tired of fighting with Microsoft 365 APIs and complex authentication flows? This practical tutorial cuts through the complexity, showing you how to build production-ready Python automations for Outlook, Calendar, and SharePoint in just 60 minutes.
No OAuth2 struggles, no Graph API complexity—just working code you can deploy today.
What you'll learn in the tutorial:
- Connect to Microsoft 365 APIs with minimal Python code
- Build real email, calendar, and SharePoint automations
- Schedule background tasks without programming
- Access Entra ID (Azure AD) user data effortlessly
- Implement enterprise-grade patterns that solve actual business problems
More resources
➤ Python API integration tutorials
➤ What is a Network Packet Broker? How to automate networks in Python?
➤ What is an integration platform?
➤ Python Integration platform as a Service (iPaaS)
➤ What is an Enterprise Service Bus (ESB)? What is SOA?
➤ Open-source iPaaS in Python
December 08, 2025 03:00 AM UTC
Seth Michael Larson
Deprecations via warnings don’t work for Python libraries
Last week urllib3 v2.6.0 was released which contained removals for
several APIs that we've known were problematic since 2019 and
have been deprecated since 2022. The deprecations
were marked in the documentation, changelog, and what I incorrectly believed
would be the most meaningful signal to users: with a DeprecationWarning
being emitted for each use for the API.
The API that urllib3 recommended users use instead has the same features and no compatibility issues between urllib3 1.x and 2.x:
resp = urllib3.request("GET", "https://example.com")
# Deprecated APIs
resp.getheader("Content-Length")
resp.getheaders()
# Recommended APIs
resp.headers.get("Content-Length")
resp.headers
This API was emitting warnings for over 3 years in a top-3 Python package by downloads urging libraries and users to stop using the API and that was not enough. We still received feedback from users that this removal was unexpected and was breaking dependent libraries. We ended up adding the APIs back and creating a hurried release to fix the issue.
It's not clear to me that waiting longer would have helped, either. The libraries that were impacted are actively developed, like the Kubernetes client, Fastly client, and Airflow and I trust that if the message had reached them they would have taken action.
My conclusion from this incident is that DeprecationWarning in its current state does not
work for deprecating APIs, at least for Python libraries. That is
unfortunate, as DeprecationWarning and the warnings module
are easy-to-use, language-“blessed”, and explicit without impacting users that don't
need to take action due to deprecations. Any other method of deprecating
API features is likely to be home-grown and different across each project
which is far worse for users and project maintainers.
Possible solutions?
DeprecationWarning is called out in the “ignored by default” list
for Python. I could ask for more Python developers to run with warnings enabled, but solutions in the form of “if only we could all just” are a folly.
Maybe the answer is for each library to create its own
“deprecation warning” equivalent just to not be in the “ignored by default” list:
import warnings
class Urllib3DeprecationWarning(UserWarning):
pass
warnings.warn(
"HTTPResponse.getheader() is deprecated",
category=Urllib3DeprecationWarning,
stacklevel=2
)
Maybe the answer is to do away with advance notice and adopt SemVer with many major versions, similar to how Cryptography operates for API compatibility. Let me know if you have other ideas.
Thanks for keeping RSS alive! ♥
December 08, 2025 12:00 AM UTC
December 07, 2025
Christian Ledermann
🎮 *brkrs*: A Brand New Take on Classic Brick-Breaking – Play It, Tweak It, Own It!
Remember the pure, unadulterated joy (and occasional rage) of games like Breakout and Arkanoid? Dodging, bouncing, and strategically smashing bricks for that satisfying thwack?
Well, get ready for brkrs – a modern, full-featured brick-breaker that brings all that classic arcade action to a new generation, built with cutting-edge Rust 🦀 and the incredibly flexible Bevy game engine!
Want to jump straight into the action or peek under the hood? Find everything here: github.com/cleder/brkrs
brkrs isn't just another clone; it's a love letter to the genre, packed with modern physics, dynamic levels, and a secret weapon: it's entirely open-source, designed for you to play, tinker, and even contribute!
🚀 The Story: From Retro Dreams to Modern Reality
Many of us have dreamed of remaking our favorite classics. For me, that dream was to revive an old Arkanoid-style game, "YaAC 🐧", using today's best game development tools. What started as a manual journey quickly evolved into something much more: a real game that's also a living showcase of modern game dev practices.
It’s built on a philosophy of "Kaizen no michi" (改善の道) – making small, continuous improvements. This means the game is always evolving, and every change is carefully considered.
🕹️ Play It Now: Levels That Challenge, Physics That Impress
No downloads needed to get a taste of the action!
Hit up the web version and start smashing bricks here
Sorry at this time its only 2 levels (it is still early in the development process), but 70 more (lifted from YAAC) are coming soon, so stay tuned, or even better, help to make it come true ;-)
brkrs extends the classic formula with some seriously cool features:
- Classic Gameplay, Modern Feel: Paddle, ball, and bricks, but with a polished, satisfying punch.
- Rich Physics (Rapier3D): Experience accurate and engaging ball physics that make every bounce feel real.
- Dynamic Levels: Human-readable and easy-to-modify level configurations mean endless possibilities for custom stages.
- Paddle Rotation: Add a new layer of skill and strategy to your shots.
- Cross-Platform Fun: Play it on your desktop or directly in your browser thanks to WebAssembly!
🛠️ Go Deeper: A Game for Builders, Too
For those who love to dive into the mechanics of their favourite games, brkrs is a treasure trove. It's not just playable; it's also a fantastic example of a well-structured Rust and Bevy project.
Want to try building it yourself? You'll need Rust, Cargo, and Git.
git clone https://github.com/cleder/brkrs.git
cd brkrs
cargo run --release
Controls: Move the paddle with your mouse, use the scroll wheel to rotate (if enabled), and hit ESC to pause.
This is your chance to not just play, but to truly tinker. Ever wanted to add a new power-up? Change how a brick explodes? Or even design your own crazy levels? brkrs makes it approachable.
🧠 Behind the Scenes: Spec-Driven Awesomeness
The game's development isn't just chaotic coding; it's built on spec-driven development (SDD). This means every feature starts with a clear, detailed plan, much like a game designer's blueprint. We even use GitHub's spec-kit to formalize these plans. It's a structured way to ensure every piece of the game works exactly as intended, minimizing bugs and maximizing fun.
And here's the kicker: this clear, step-by-step approach makes brkrs a perfect playground for experimenting with AI-assisted coding. Imagine using AI to help design a new brick type or tweak game logic – the structured specs make it surprisingly effective!
📣 Help Wanted: Your Skills Can Level Up brkrs!
While the code is solid, a great game needs more than just logic! We are actively looking for creative community members to join the effort and help turn brkrs into a visually and aurally stunning experience.
This is your chance to get your work into a real, playable, open-source game!
- 🎧 Sound & Music: We need satisfying sound effects (the thwack of a brick, the clink of a power-up) and engaging background music.
- 🎨 Art & Textures: Help us create unique brick textures, stylish paddle designs, backgrounds, and other necessary artwork.
- 📐 Level Design: Got an evil streak? Use the easy-to-modify level configuration files (RON) to create new, challenging, and fun level designs!
- 🧪 Testing & Feedback: Simply playing the game and reporting bugs or suggesting balance tweaks is incredibly valuable!
If you're a designer, artist, musician, or just a gamer with a great eye for detail, reach out or submit a Pull Request with your contributions!
🤝 Join the Fun: Learn, Contribute, Create!
brkrs is more than a game; it's a community project following "Seika no Ho" (清華の法), "the way of clear planning."
- Play the Game: Enjoy the current levels and discover new strategies.
- Explore the Code: See how modern Rust and Bevy work in a real project.
- Suggest Ideas: What power-ups or brick types would YOU like to see?
- Contribute: Even small tweaks or new level designs are welcome!
Full documentation, quickstart guides, and developer resources are all available on brkrs.readthedocs.io.
Ready to break some bricks and make some waves in game development?
December 07, 2025 08:33 PM UTC
🚀 Breakout to Breakthrough: brkrs —The Rust Game Where Specs Become Code (and AI is Welcome!)
Tired of tutorial code that stops working the moment the lesson ends? Meet brkrs—a fully playable, Arkanoid/Breakout-style game written in Rust 🦀 and built with the Bevy engine.
But this isn't just a game. It's an open-source learning playground dedicated to spec-first development and AI-assisted coding experiments.
Check out the full repository here: github.com/cleder/brkrs
As Linus Torvalds famously said: “Talk is cheap. Show me the code.” We say: "Show me the game, the spec, and the code all at once!"
💡 The Philosophy: Spec-First, Incremental, and AI-Ready
Game development, especially in a framework like Bevy, can be a steep climb. The brkrs project was born from the desire to take an old idea (an Arkanoid clone) and build it the modern way—a way that accelerates learning and embraces new tooling.
We follow a simple, yet powerful, development loop:
- Spec-First: Every single feature, no matter how small, begins as a clear specification using GitHub's speckit.
- Incremental PRs: The spec flows through a small, focused issue or Pull Request. This embodies the "Kaizen no michi" (改善の道) philosophy of small, positive, daily changes.
- Code & Play: The result is working Rust code you can immediately see in the game.
This structured approach makes brkrs the perfect sandbox for the AI coding community:
- Agentic Testing: Need a small, contained task for your coding agent? Point it at a spec and a pending issue.
- AI-Assisted Feature Dev: Want to see how your favorite LLM handles adding a new brick behavior or adjusting physics? The clear specs provide the perfect prompt.
- Workflow Learning: Every merged PR is a clean, documented example of how a real-world feature is implemented in Rust/Bevy.
What is Spec-Driven Development?
The core of our workflow is the use of GitHub's spec-kit. This is a framework for spec-driven development (SDD), an approach where detailed, human-readable specifications are written before any code. SDD serves as the single source of truth for the desired behavior of a feature. By providing clear inputs, outputs, and requirements upfront, it minimizes guesswork, aligns team expectations, and provides a perfect, structured input for any AI coding assistant or agent.
🕹️ Try It Now: Playable & Pluggable
You don't need to compile anything to get started!
Play the live web version right now!
The core experience extends the classic Breakout formula with:
- Richer Physics (via Rapier3D) constrained to a flat 2D plane.
- Paddle Rotation and customizable per-level settings.
- Human-readable Levels that are easy to modify and extend using RON files.
🛠️ Quickstart: Play, Tweak, and Learn
Ready to dive into the code? You'll need Rust, Cargo, and Git.
git clone https://github.com/cleder/brkrs.git
cd brkrs
cargo run --release
Controls: Move the paddle with the mouse, use the scroll wheel to rotate, and ESC to pause.
Now, the fun begins. Want to change the gravity for Level 3? Want to create a new HyperBrick component? The entire architecture—from the Level Loader to the Brick System—is designed for easy modification.
Challenge: Following the Samurai principle of "Seika no Ho" (清華の法), "the way of clear planning," pick a small feature, write a mini-spec, and implement it.
🤝 Your Learning Path and Contribution
The goal is to make learning modern Rust/Bevy development as enjoyable as playing the game.
Here’s how you can engage:
- Read a Spec: Check out the repo or wiki for a feature you'd like to see.
- Pick an Issue: Find a small, contained task that aligns with a spec.
- Experiment with AI: Use your favourite AI tool (e.g., GitHub Copilot, a local agent) to help draft the code for the task.
- Submit a PR: Show the community how you turned a spec into working Rust code!
brkrs is more than just a Breakout clone—it’s a living textbook for best practices in modern, spec-driven, and AI-augmented software development.
🔗 Documentation
All the details you need to get started are right here:
- Full Documentation
- Quickstart Guide — Get up and running in 10 minutes.
Ready to break some bricks and code?
December 07, 2025 07:55 PM UTC
December 05, 2025
Real Python
The Real Python Podcast – Episode #276: Exploring Quantum Computing & Python Frameworks
What are the recent advances in the field of quantum computing and high-performance computing? And what Python tools can you use to develop programs that run on quantum computers? This week on the show, Real Python author Negar Vahid discusses her tutorial, "Quantum Computing Basics With Qiskit."
[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]
December 05, 2025 12:00 PM UTC
Mark Dufour
Shed Skin restricted-Python-to-C++ compiler v0.9.11
I have just released version 0.9.11 of Shed Skin, a restricted-Python-to-C++ compiler. Most importantly, it adds support for Python 3.14. It also adds support for many 3.x features that were not yet implemented, in addition to basic support for the base64 module. It also optimizes a few more common code patterns.
Paul Boddie was able to add support for libpcre2, and in the process updated conan to version 2. Thanks to Shakeeb and now Paul, Shed Skin has had first-class Windows support for the last few releases.
A new release is often triggered by a nice new example. In this case I found an advanced/educational 3d renderer by Benny Bobaganoosh, and rewrote it from Java to Python. In ~500 lines of code, it renders an .obj file with perspective-correct texture mapping and so on, clipping, lighting.. It becomes about 13 times faster after compilation (in other words, it goes from about 2 to about 30 FPS).
For the full list of changes in the release, please see the release notes.
Something I have noticed while working on this release is that small object allocations seem to have become faster under Linux, to the degree that programs that would become _slower_ after compilation because of excessive small-object allocation, are now usually _faster_ again, at least on my system. This motivated me to measure the speedup for all 84 example programs at the moment versus cpython 3.13. While it's still all over the place, I was happy to see a median speedup of 12 times, and an average of 20 times.
I would very much appreciate more feedback on/assistance with the project. There is always enough low-hanging fruit to help with! See for example the current list of issues for 0.9.12. But just testing random things, finding interesting new example programs, cleaning up parts of the code and such are also much appreciated.
December 05, 2025 03:08 AM UTC
December 03, 2025
Caktus Consulting Group
LLM Basics: Ollama Function Calling
In our previous post, we introduced function calling and learned how to do it with OpenAI’s LLMs.
In this post, we’ll call the same cactify_name function from that post using Meta’s
Llama 3.2 model, installed locally using Ollama. The techniques in this post should also work
with other Ollama models that support function-calling.
December 03, 2025 04:42 PM UTC
Real Python
How to Use Google's Gemini CLI for AI Code Assistance
This tutorial will teach you how to use Gemini CLI to bring Google’s AI-powered coding assistance directly into your terminal. After you authenticate with your Google account, this tool will be ready to help you analyze code, identify bugs, and suggest fixes—all without leaving your familiar development environment:
Gemini CLIImagine debugging code without switching between your console and browser, or picture getting instant explanations for unfamiliar projects. Like other command-line AI assistants, Google’s Gemini CLI brings AI-powered coding assistance directly into your command line, allowing you to stay focused in your development workflow.
Whether you’re troubleshooting a stubborn bug, understanding legacy code, or generating documentation, this tool acts as an intelligent pair-programming partner that understands your codebase’s context.
You’re about to install Gemini CLI, authenticate with Google’s free tier, and put it to work on an actual Python project. You’ll discover how natural language queries can help you understand code faster and catch bugs that might slip past manual review.
Prerequisites
To follow along with this tutorial, you’ll need the following:
- Google Account: A personal Google account is required to use Gemini CLI’s free tier, which offers one thousand requests per day and sixty requests per minute at no charge.
- Python 3.12 or Higher: You’ll work with a Python command-line application to demonstrate Gemini CLI’s capabilities. If you haven’t already, install Python on your system, making sure the minimum version is Python 3.12.
- Node.js 20 or Higher: Gemini CLI is distributed through npm, Node.js’s package manager. You’ll verify your Node.js installation in the next section.
Because Gemini CLI is a command-line tool, you should feel comfortable navigating your terminal and running basic shell commands.
Go ahead and download the supporting materials to get the Python project you’ll be working with throughout this tutorial:
Get Your Code: Click here to download the free sample code that you’ll use to take Google’s Gemini CLI for a spin.
Once you’ve extracted the files, you’ll find a todolist/ directory containing a complete Python CLI application, which is similar to the to-do app covered in another tutorial. This project will serve as your testing ground for Gemini CLI’s code analysis and debugging features.
Take the Quiz: Test your knowledge with our interactive “How to Use Google's Gemini CLI for AI Code Assistance” quiz. You’ll receive a score upon completion to help you track your learning progress:
Interactive Quiz
How to Use Google's Gemini CLI for AI Code AssistanceLearn how to install, authenticate, and safely use the Gemini CLI to interact with Google's Gemini models.
Step 1: Install and Set Up Gemini CLI
Before you can start using the AI-powered features of Gemini CLI, you need to get it installed on your system and authenticate with Google. In this step, you’ll verify your Node.js installation, install Gemini CLI globally, and complete the authentication process to access the free tier.
Verify Your Node.js Installation
Gemini CLI is primarily implemented in TypeScript, which requires Node.js. You’ll need Node.js version 20 or higher to run Gemini CLI. First, check if you have Node.js installed in the required version by opening your terminal and running this command:
$ node --version
v24.11.1
If you see a version number of 20 or higher, then you’re all set. Otherwise, if you encounter a command not found error or have an older version, then you’ll need to install or update Node.js before continuing.
Note: If you’re on macOS or Linux, then you can leverage Homebrew to get Gemini CLI without having to install Node.js yourself.
The recommended approach to install Node.js is to use the Node Version Manager (nvm), which allows you to install and switch between multiple Node.js versions, much like pyenv does for Python. You can find detailed installation instructions for your operating system on the Node.js download page.
Once Node.js is installed, you’ll also have access to the Node Package Manager (npm), which you’ll use in the next step.
Install Gemini CLI Globally
With Node.js installed, you can now install Gemini CLI using npm. The -g flag installs the package globally, making the gemini command available from anywhere in your file system:
$ npm install -g @google/gemini-cli
Read the full article at https://realpython.com/how-to-use-gemini-cli/ »
[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]
December 03, 2025 02:00 PM UTC
Django Weblog
Django 6.0 released
The Django team is happy to announce the release of Django 6.0.
The release notes assembles a mosaic of modern tools and thoughtful design. A few highlights are:
- Template Partials: modularize templates using small, named fragments for cleaner, more maintainable code. (GSoC project by Farhan Ali Raza, mentored by Carlton Gibson)
- Background Tasks: run code outside the HTTP request-response cycle with a built-in, flexible task framework. (Jake Howard)
- Content Security Policy (CSP): easily configure and enforce browser-level security policies to protect against content injection. (Rob Hudson)
- Modernized Email API: compose and send emails with Python's EmailMessage class for a cleaner, Unicode-friendly interface. (Mike Edmunds)
You can get Django 6.0 from our downloads page or from the Python Package Index.
The PGP key ID used for this release is Natalia Bidart: 2EE82A8D9470983E
With the release of Django 6.0, Django 5.2 has reached the end of mainstream support. The final minor bug fix release, 5.2.9, was issued yesterday. Django 5.2 will receive security and data loss fixes until April 2028. All users are encouraged to upgrade before then to continue receiving fixes for security issues.
Django 5.1 has reached the end of extended support. The final security release, 5.1.15, was issued on Dec. 2, 2025. All Django 5.1 users are encouraged to upgrade to a supported Django version.
See the downloads page for a table of supported versions and the future release schedule.
December 03, 2025 12:00 PM UTC
Real Python
Quiz: How to Use Google's Gemini CLI for AI Code Assistance
In this quiz, you’ll test your understanding of the How to Use Google’s Gemini CLI for AI Code Assistance tutorial.
By working through these questions, you’ll revisit how to install and verify prerequisites like Node.js, explore authentication options, and understand the CLI’s permission and safety model. You’ll also practice managing interactive sessions, enforcing stronger models, and approving or editing shell commands securely.
To deepen your understanding, review the sections on verifying your environment, authenticating safely, and running interactive prompts in the linked tutorial.
[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]
December 03, 2025 12:00 PM UTC
Talk Python to Me
#529: Computer Science from Scratch
A lot of people building software today never took the traditional CS path. They arrived through curiosity, a job that needed automating, or a late-night itch to make something work. This week, David Kopec joins me to talk about rebuilding computer science for exactly those folks, the ones who learned to program first and are now ready to understand the deeper ideas that power the tools they use every day.<br/> <br/> <strong>Episode sponsors</strong><br/> <br/> <a href='https://talkpython.fm/sentry'>Sentry Error Monitoring, Code TALKPYTHON</a><br> <a href='https://talkpython.fm/nordstellar'>NordStellar</a><br> <a href='https://talkpython.fm/training'>Talk Python Courses</a><br/> <br/> <h2 class="links-heading mb-4">Links from the show</h2> <div><strong>David Kopec</strong>: <a href="https://davekopec.com?featured_on=talkpython" target="_blank" >davekopec.com</a><br/> <strong>Classic Computer Science Book</strong>: <a href="https://www.amazon.com/Classic-Computer-Science-Problems-Python/dp/1617295981?featured_on=talkpython" target="_blank" >amazon.com</a><br/> <strong>Computer Science from Scratch Book</strong>: <a href="https://computersciencefromscratch.com?featured_on=talkpython" target="_blank" >computersciencefromscratch.com</a><br/> <strong>Computer Science from Scratch at NoStartch (CSFS30 for 30% off)</strong>: <a href="https://nostarch.com/computer-science-from-scratch?featured_on=talkpython" target="_blank" >nostarch.com</a><br/> <br/> <strong>Watch this episode on YouTube</strong>: <a href="https://www.youtube.com/watch?v=EVQOoD6cZmg" target="_blank" >youtube.com</a><br/> <strong>Episode #529 deep-dive</strong>: <a href="https://talkpython.fm/episodes/show/529/computer-science-from-scratch#takeaways-anchor" target="_blank" >talkpython.fm/529</a><br/> <strong>Episode transcripts</strong>: <a href="https://talkpython.fm/episodes/transcript/529/computer-science-from-scratch" target="_blank" >talkpython.fm</a><br/> <br/> <strong>Theme Song: Developer Rap</strong><br/> <strong>🥁 Served in a Flask 🎸</strong>: <a href="https://talkpython.fm/flasksong" target="_blank" >talkpython.fm/flasksong</a><br/> <br/> <strong>---== Don't be a stranger ==---</strong><br/> <strong>YouTube</strong>: <a href="https://talkpython.fm/youtube" target="_blank" ><i class="fa-brands fa-youtube"></i> youtube.com/@talkpython</a><br/> <br/> <strong>Bluesky</strong>: <a href="https://bsky.app/profile/talkpython.fm" target="_blank" >@talkpython.fm</a><br/> <strong>Mastodon</strong>: <a href="https://fosstodon.org/web/@talkpython" target="_blank" ><i class="fa-brands fa-mastodon"></i> @talkpython@fosstodon.org</a><br/> <strong>X.com</strong>: <a href="https://x.com/talkpython" target="_blank" ><i class="fa-brands fa-twitter"></i> @talkpython</a><br/> <br/> <strong>Michael on Bluesky</strong>: <a href="https://bsky.app/profile/mkennedy.codes?featured_on=talkpython" target="_blank" >@mkennedy.codes</a><br/> <strong>Michael on Mastodon</strong>: <a href="https://fosstodon.org/web/@mkennedy" target="_blank" ><i class="fa-brands fa-mastodon"></i> @mkennedy@fosstodon.org</a><br/> <strong>Michael on X.com</strong>: <a href="https://x.com/mkennedy?featured_on=talkpython" target="_blank" ><i class="fa-brands fa-twitter"></i> @mkennedy</a><br/></div>
December 03, 2025 08:00 AM UTC
December 02, 2025
Christian Ledermann
Game development with SpecKit, Rust and Bevy
brkrs — a fun, playable brick-breaker game & learning playground
brkrs is a real, playable Breakout/Arkanoid-style game written in Rust 🦀 using the Bevy engine.
It’s also a hands-on learning project, letting you explore:
- Spec-first development with GitHub speckit
- Incremental feature development through issues & PRs
- AI-assisted and agentic coding experiments
Every feature starts as a spec, flows through an issue or PR, and ends as working Rust code. You can play the game, explore the code, and learn modern Rust/Bevy workflows all at the same time.
Linus Torvalds said: “Talk is cheap. Show me the code.”
brkrs lets you play, tinker, and see the specs come alive in a real game.
The Story Behind brkrs
I always wanted to rewrite my old Arkanoid/Breakout-style game, YaAC 🐧, in a modern game framework.
I began by manually implementing the core gameplay foundations: reading documentation, following examples, and building a basic proof-of-concept with the essential mechanics (ball, paddle, bricks).
It quickly became clear that doing everything manually would involve a steep learning curve and a lot of time.
brkrs was born as a solution: a way to learn modern Rust game development, apply spec-first workflows, and experiment with AI-assisted coding, all while still having fun playing a real game.
Try it now
You can play a web version on GitHub Pages
Key Features
brkrs is a Breakout/Arkanoid style game implemented in Rust with the Bevy engine. It extends the classic formula with richer physics, paddle rotation, and per-level configuration.
- Classic Breakout-style gameplay: paddle, ball, bricks, and levels
- Levels are human-readable and easy to modify
- Spec-first workflow: every feature begins as a spec and ends as working Rust code
- Small, incremental PRs demonstrate the development workflow and learning path
- Crate-ready and cross-platform (desktop + WebAssembly builds)
- A fun, approachable way to learn Rust, Bevy, and modern coding practices
Quickstart (play & learn)
Prerequisites: Rust + Cargo + Git
git clone https://github.com/cleder/brkrs.git
cd brkrs
cargo run --release
Controls: move paddle with mouse, scroll wheel to rotate (if enabled), ESC to pause.
Play, tweak, and learn — modify levels, bricks, or mechanics to see specs turn into features.
Core Systems
- Physics (Rapier3D) – 3D physics constrained to a flat play plane.
- Game State – (planned) menu, playing, paused, game over, transitions.
- Level Loader – RON file parsing, entity spawning, per-level gravity.
- Brick System – Extensible brick behaviors via components & events.
- Pause System – ESC to pause, click to resume, with window mode switching (native).
Learning Path & Contribution
This project is intended to be fun and educational. Suggested learning steps:
- Read a spec in the repo or wiki
- Pick a small issue to implement
- Submit a PR that fulfills the spec
- Experiment with AI-assisted features or gameplay tweaks
Documentation
Full documentation is available at brkrs.readthedocs.io:
- Quickstart Guide — Get running in 10 minutes
- Developer Guide — Set up a development environment
- API Reference — Rust API documentation
Why You’ll Enjoy It
- Play a real game while learning coding practices
- Watch specs transform into working features
- Experiment safely with Rust, Bevy, and AI-assisted workflows
- Learn by doing in a hands-on, playful way
December 02, 2025 10:00 PM UTC
PyCoder’s Weekly
Issue #711: pairwise(), Mocks, Claude, and More (Dec. 2, 2025)
#711 – DECEMBER 2, 2025
View in Browser »
Generalising itertools.pairwise
This article teaches you about itertools.pairwise, a function for accessing pairs of components over an iterable. Learn where it is helpful and what its limitations are.
RODRIGO GIRÃO SERRÃO
Why Your Mock Breaks Later
An overly aggressive mock can work fine, but then break much later. If you don’t mock the right spot in your code you can break other testing libraries.
NED BATCHELDER
Turn Multi-Agent Mayhem into Harmony (with Python + Temporal)
AI is powerful but messier than a three-way Git merge on a Friday afternoon. Join us to see how Temporal helps Python devs orchestrate multi-agent systems with confidence. Learn how to make your agents play nicely and your code stay clean →
TEMPORAL sponsor
Getting Started With Claude Code
Learn to set up and use Claude Code for Python projects: install, run commands, and integrate with Git.
REAL PYTHON course
PyCon Austria 2026: Free Conference, Registration Is Open
PYCON.AT • Shared by Horst JENS
Microsoft Announces SQL Server Python Driver
MICROSOFT.COM • Shared by Howard Rothenburg
Python Jobs
Python Video Course Instructor (Anywhere)
Python Tutorial Writer (Anywhere)
Articles & Tutorials
PyPI and Shai-Hulud: Staying Secure Amid Emerging Threats
There is an attack on-going in the JavaScript/NPM world that has been named Shai-Hulud. It has targeted a large number of packages. So far, PyPI has not been exploited, but attempts have been made. This post explains what the folks at PyPI are doing to prevent problems and how you can protect yourself.
MIKE FIEDLER
Understanding the Different POST Content Types
When writing code that accepts user data on the web, you usually are using the HTTP POST method. POST supports several different types of data in the request body. This post teaches you about each of them, with examples in Django to make it clearer.
AIDAS BENDORAITIS
B2B Authentication for any Situation - Fully Managed or BYO
What your sales team needs to close deals: multi-tenancy, SAML, SSO, SCIM provisioning, passkeys…What you’d rather be doing: almost anything else. PropelAuth does it all for you, at every stage →
PROPELAUTH sponsor
American Data Centers
This step-by-step post shows you how to do data analysis on the Business Insider’s dataset on American Data Centres. The analysis uses a variety of tools, including the Python esprima library for parsing, duckdb, and more.
MARK LITWINTSCHIK
Django: Implement HTTP Bearer Authentication
HTTP Bearer is a header-based mechanism authentication mechanism. There are many Django frameworks that support it, but some can be a little heavy weight. Learn how to handle HTTP Bearer Authentication in your own code.
ADAM JOHNSON
Pydantic Can Do What?
Pydantic started out as a validation library but over the years it has added many useful features. It includes a full-featured settings loader which can read from multiple env files, config files, and cloud vaults.
BITE CODE!
Why Django’s DATETIME_FORMAT Ignores You
A dive into why Django’s DATETIME_FORMAT setting seems to do nothing, and how to actually force the 24-hour clock in the admin, even when your locale says otherwise.
KEVIN RENSKERS
Disable Network Requests When Running pytest
Even with diligent mocking of external requests, a few web requests can still slip through. A quick pytest fixture can force a failure though, saving you from problems.
ANŽE PEČAR
How to Properly Indent Python Code
Learn how to properly indent Python code in IDEs, Python-aware editors, and plain text editors—plus explore PEP 8 formatters like Black and Ruff.
REAL PYTHON
Why Developers Still Flock to Python
This interview with Python creator Guido van Rossum covers everything from writing readable code to AI and the future of programming.
NATALIE GUEVARA
Your new AI Pair Programmer for Data Science
Most AI coding assistants are built for general software engineering. Positron’s AI is different. It’s designed to work with you, not replace you, while understanding your data science workflow
POSIT sponsor
Improve Your Programming Skills With Advent of Code
It is that time of year again, time for Advent of Code. Not familiar? This post explains what it is and how it can help you up-skill.
JUHA-MATTI SANTALA
How to Convert Bytes to Strings in Python
Turn Python bytes to strings, pick the right encoding, and validate results with clear error handling strategies.
REAL PYTHON
Projects & Code
elf: Advent of Code Helper for Python
GITHUB.COM/CAK • Shared by Caleb Kinney
Minimalist, Thread-Safe Config Management for Python
GITHUB.COM/POMPONCHIK • Shared by Evgeniy Blinov
Events
Weekly Real Python Office Hours Q&A (Virtual)
December 3, 2025
REALPYTHON.COM
Canberra Python Meetup
December 4, 2025
MEETUP.COM
Sydney Python User Group (SyPy)
December 4, 2025
SYPY.ORG
PyData Global 2025
December 9 to December 12, 2025
PYDATA.ORG
PiterPy Meetup
December 9, 2025
PITERPY.COM
Leipzig Python User Group Meeting
December 9, 2025
MEETUP.COM
Happy Pythoning!
This was PyCoder’s Weekly Issue #711.
View in Browser »
[ Subscribe to 🐍 PyCoder’s Weekly 💌 – Get the best Python news, articles, and tutorials delivered to your inbox once a week >> Click here to learn more ]

