Title
Planet Python
Go Home
Category
Description
Recent postings from Python-related blogs.
Address
Phone Number
+1 609-831-2326 (US) | Message me
Site Icon
Planet Python
Tags
Page Views
0
Share
Update Time
2022-05-02 01:32:02

"I love Planet Python"

www.planetpython.org VS www.gqak.com

2022-05-02 01:32:02

Planet PythonLast update: May 02, 2022 04:41 AM UTCMay 01, 2022NikolaNikola v8.2.2 is out!On behalf of the Nikola team, I am pleased to announce the immediateavailability of Nikola v8.2.2. This is a bugfix release, whose onlychange is support for the latest version of Pygments.What is Nikola?Nikola is a static site and blog generator, written in Python.It can use Mako and Jinja2 templates, and input in many popular markupformats, such as reStructuredText and Markdown — and can even turnJupyter Notebooks into blog posts! It also supports image galleries,and is multilingual. Nikola is flexible, and page builds are extremelyfast, courtesy of doit (which is rebuilding only what has been changed).Find out more at the website: https://getnikola.com/DownloadsInstall using pip install Nikola.ChangesCompatibility with Pygments 2.12.0 (Issue #3617, #3618)May 01, 2022 05:02 PM UTCZero to MasteryPython Monthly Newsletter ??29th issue of the Python Monthly Newsletter! Read by 20,000+ Python developers every month. This monthly Python newsletter covers the latest Python news so that you stay up-to-date with the industry and keep your skills sharp.May 01, 2022 10:00 AM UTCApril 30, 2022William MinchinStatic Comments Plugin 2.1.1 for Pelican ReleasedStatic Comments is a plugin for Pelican,a static site generator written in Python. It is meant as a drop in replacementfor the Pelican Comment System.Static Comments allows you to have a comment section on your Pelican blog,while maintaining your blog as a completely static webpage and without relyingon any external services or servers; just an email address is required.Comments are stored as text files, similiar in structure to Pelican articles.This gives you complete control over the comments appearing on your site andallows you to back them up with the rest of your site.This ReleaseThis release takes the existing Pelican Comment System codebase and upgradesit to work with Pelican 4 (and should continue to work with Pelican 3). A fewchanges are needed in your configuration, but no changes to your comments filesshould be needed.InstallationThe simplest way to install the Python code of Static Comments is to use pip:pip install minchin.pelican.plugins.static-comments --upgradeIf you are using Pelican 4.5+, the plugin will automatally be loaded (althoughnot activated).If you are an earlier version of Pelican, or non-namespace plugins, you willneed to add the auto-loader to your list of plugins:# pelicanconf.pyPLUGINS = [ # others "minchin.pelican.plugins.autoloader",]Activate the plugin by adding the following line to your pelicanconf.py:# pelicanconf.pyPELICAN_COMMENT_SYSTEM = Trueand then set the email you want to receive comment emails at:# pelicanconf.pyPELICAN_COMMENT_SYSTEM_EMAIL_USER = "your.email"PELICAN_COMMENT_SYSTEM_EMAIL_DOMAIN = "gmail.com"Finally, modify the article.html of your theme (if your theme doesn’tsupport Static Comments out of the box) to both display comments alreadysubmitted and to have a comment submission form. The sample submission form worksby using JavaScript to convert the form contents (the commenter’s name, site,and comment body) to an email the user then sends to you. Note, this is anexample of the code you might use for your theme, but please feel free tomodify it to suit your needs.{% macro comments_styles() %}{% if PELICAN_COMMENT_SYSTEM %}{# NOTE: # Instead of using this macro copy these styles in your main css file # This marco is only here to allow a quickstart with nice styles #}#pcs-comment-form input,#pcs-comment-form textarea { width: 100%;}#pcs-comment-form-display-replyto { border: solid 1px black; padding: 2px;}#pcs-comment-form-display-replyto p { margin-top: 0.5em; margin-bottom: 0.5em;}#pcs-comments ul { list-style: none;}#pcs-comments .comment-left { display: table-cell; padding-right: 10px;}#pcs-comments .comment-body { display: table-cell; vertical-align: top; width: 100%;}{% endif %}{% endmacro %}{% macro comments_form() %}{% if PELICAN_COMMENT_SYSTEM %} {% endif %}{% endmacro %}{% macro comments_with_form() %}{% if PELICAN_COMMENT_SYSTEM %} Comments {% if article.comments %} {% for comment in article.comments recursive %} ="" span="" src="{{ SITEURL }}/{{ comment.avatar }}"/> alt="Avatar" height="{{ PELICAN_COMMENT_SYSTEM_IDENTICON_SIZE }}" width="{{ PELICAN_COMMENT_SYSTEM_IDENTICON_SIZE }}"> Permalink Reply {% if comment.metadata['website'] %} {{ comment.author }} {% else %} {{ comment.author }} {% endif %} Posted on {{ comment.locale_date }} {{ comment.content }} {% if comment.replies %} {{ loop(comment.replies) }} {% endif %} {% endfor %} {% else %} There are no comments yet. {% endif %} {{ comments_form() }}{% endif %}{% endmacro %}{% macro comments_js(user, domain, includeJquery=True) %}{% if PELICAN_COMMENT_SYSTEM %} {% if includeJquery %} {% endif %} ++get('Session Purged')) && $session->get('Session Purged') == 1) ? 1 : 0;[...]if ($is_cloned_session) {$self->log("Not cleaning session: cloned chroot in use\n");} else {if ($purge_build_deps) { # Removing dependencies $resolver->uninstall_deps();} else { $self->log("Not removing build depends: as requested\n");}}The schroot builder defines that parameter as: $self->set('Session Purged', $info->{'Session Purged'});... which is ... a little confusing to me. $info is:my $info = $self->get('Chroots')->get_info($schroot_session);... so I presume that depends on whether the schroot was correctlycleaned up? I stopped digging there...ChrootUnshare.pm is way more explicit:$self->set('Session Purged', 1);I wonder if we should do something like this with the autopkgtestbackend. I guess people might technically use it with something elsethan qemu, but qemu is the typical use case of the autopkgtestbackend, in my experience. Or at least certainly with things thatcleanup after themselves. Right?For some reason, before I added this line to my configuration:$purge_build_deps = 'never';... the "Cleanup" step would just completely hang. It was quitebizarre.Disgression on the diversity of VM-like thingsThere are a lot of different virtualization solutions one can use(e.g. Xen, KVM, Docker or Virtualbox). I have alsofound libguestfs to be useful to operate on virtual images invarious ways. Libvirt and Vagrant are also useful wrappers ontop of the above systems.There are particularly a lot of different tools which use Docker,Virtual machines or some sort of isolation stronger than chroot tobuild packages. Here are some of the alternatives I am aware of:Whalebuilder - Docker builderconbuilder - "container" builderdebspawn - system-nspawn builderdocker-buildpackage - Docker builderqemubuilder - qemu builderqemu-sbuild-utils - qemu + sbuild + autopkgtestTake, for example, Whalebuilder, which uses Docker to buildpackages instead of pbuilder or sbuild. Docker provides moreisolation than a simple chroot: in whalebuilder, packages arebuilt without network access and inside a virtualizedenvironment. Keep in mind there are limitations to Docker's securityand that pbuilder and sbuild do build under a different userwhich will limit the security issues with building untrustedpackages.On the upside, some of things are being fixed: whalebuilder is nowan official Debian package (whalebuilder) and has addedthe feature of passing custom arguments to dpkg-buildpackage.None of those solutions (except the autopkgtest/qemu backend) areimplemented as a sbuild plugin, which would greatly reduce theircomplexity.I was previously using Qemu directly to run virtual machines, andhad to create VMs by hand with various tools. This didn't work so wellso I switched to using Vagrant as a de-facto standard to builddevelopment environment machines, but I'm returning to Qemu because ituses a similar backend as KVM and can be used to host longer-runningvirtual machines through libvirt.The great thing now is that autopkgtest has good support for qemuand sbuild has bridged the gap and can use it as a buildbackend. I originally had found those bugs in that setup, but all ofthem are now fixed:#911977: sbuild: how do we correctly guess the VM name in autopkgtest?#911979: sbuild: fails on chown in autopkgtest-qemu backend#911963: autopkgtest qemu build fails with proxy_cmd: parameter not set#911981: autopkgtest: qemu server warns about missing CPU featuresSo we have unification! It's possible to run your virtual machinesand Debian builds using a single VM image backend storage, which isno small feat, in my humble opinion. See the sbuild-qemu blog postfor the annoucementNow I just need to figure out how to merge Vagrant, GNOME Boxes, andlibvirt together, which should be a matter of placing images in theright place... right? See also hosting.pbuilder vs sbuildI was previously using pbuilder and switched in 2017 to sbuild.AskUbuntu.com has a good comparative between pbuilder and sbuildthat shows they are pretty similar. The big advantage of sbuild isthat it is the tool in use on the buildds and it's written in Perlinstead of shell.My concerns about switching were POLA (I'm used to pbuilder), the factthat pbuilder runs as a separate user (works with sbuild as well now,if the _apt user is present), and setting up COW semantics in sbuild(can't just plug cowbuilder there, need to configure overlayfs oraufs, which was non-trivial in Debian jessie).Ubuntu folks, again, have more documentation there. Debianalso has extensive documentation, especially about how toconfigure overlays.I was ultimately convinced by stapelberg's post on the topic whichshows how much simpler sbuild really is...WhoThanks lavamind for the introduction to the sbuild-qemu package.April 27, 2022 08:29 PM UTCMike DriscollPython 101 - The REPL (Video)In this tutorial, you will learn what a REPL is and why it is useful. I also show you a couple of alternative REPL environments in this tutorial, such as IDLE and IPython.Related ArticlesAn Intro to Python EditorsPython 101 - An Intro to IDLEThe post Python 101 - The REPL (Video) appeared first on Mouse Vs Python.April 27, 2022 08:23 PM UTC"Morphex's Blogologue"Some more work on an Ethereum (classic) accounting toolSo, I've hacked some more on the tool I'm building for accounting purposes.I guess since the last time I've posted on it, there are mainly two things I've been working on, one is valuation of crypto currency, the other is correctness of generated CSVs.I've followed a simple principle when it comes to valuation of the crypto currency; and that is, first in, first out. Other options could be first in, highest value out, or first in, lowest value out.It looks like in Norway, there is also the option of first in, whichever you want out; meaning you can receive crypto, and for tax purposes, choose which crypto currency you sell first. Which could be useful for tax purposes, to increase or decrease the tax owed due to dealings with crypto currency.But it's a bit to keep track of, and I think I've gotten most of it done.Another part however, is making sure the values in the CSV / Spreadsheet are correct, and I noticed that somewhere along the line of transactions, the account balance was off, compared to the state in etherscan.io for example. So I started looking, and figured out that it was due to a transaction that was registered, but didn't complete, because it ran out of gas. The max fee to complete the transaction was too low.But as the transaction is still registered, you still have to pay the gas fee, so for that transaction, the value of the crypto transferred to another account is zero, and the gas fee still needs to be deducted.You can see more about this on the go-ethereum issue trackerhttps://github.com/ethereum/go-ethereum/issues/24768there is also information in the commit:https://github.com/morphex/ethereum-classic-taxman/commit/1a...I think this shows, really well, how good Python integrates with the command line, and how easy it is to get something done in Python. A handful of changed lines, and it is possible to manually exclude a set of comma-separated transactions.Of course this is also due to knowledge of how Python works, but yes, a great scripting and prototyping language Python is.April 27, 2022 04:07 PM UTCReal PythonWhy Is It Important to Close Files in Python?At some point in your Python coding journey, you learn that you should use a context manager to open files. Python context managers make it easy to close your files once you’re done with them:with open("hello.txt", mode="w") as file: file.write("Hello, World!")The with statement initiates a context manager. In this example, the context manager opens the file hello.txt and manages the file resource as long as the context is active. In general, all the code in the indented block depends on the file object being open. Once the indented block either ends or raises an exception, then the file will close.If you’re not using a context manager or you’re working in a different language, then you might explicitly close files with the try … finally approach:try: file = open("hello.txt", mode="w") file.write("Hello, World!")finally: file.close()The finally block that closes the file runs unconditionally, whether the try block succeeds or fails. While this syntax effectively closes the file, the Python context manager offers less verbose and more intuitive syntax. Additionally, it’s a bit more flexible than simply wrapping your code with try … finally.You probably use context managers to manage files already, but have you ever wondered why most tutorials and four out of five dentists recommend doing this? In short, why is it important to close files in Python?In this tutorial, you’ll dive into that very question. First, you’ll learn about how file handles are a limited resource. Then you’ll experiment with the consequences of not closing your files.Free Download: Get a sample chapter from CPython Internals: Your Guide to the Python 3 Interpreter showing you how to unlock the inner workings of the Python language, compile the Python interpreter from source code, and participate in the development of CPython.In Short: Files Are Resources Limited by the Operating SystemPython delegates file operations to the operating system. The operating system is the mediator between processes, such as Python, and all the system resources, such as the hard drive, RAM, and CPU time.When you open a file with open(), you make a system call to the operating system to locate that file on the hard drive and prepare it for reading or writing. The operating system will then return an unsigned integer called a file handle on Windows and a file descriptor on UNIX-like systems, including Linux and macOS:A Python process making a system call and getting the integer 10 as the file handleOnce you have the number associated with the file, you’re ready to do read or write operations. Whenever Python wants to read, write, or close the file, it’ll make another system call, providing the file handle number. The Python file object has a .fileno() method that you can use to find the file handle:>>>>>> with open("test_file.txt", mode="w") as file:... file.fileno()...4The .fileno() method on the opened file object will return the integer used by the operating system as a file descriptor. Just like how you might use an ID field to get a record from a database, Python provides this number to the operating system every time it reads or writes from a file.Read the full article at https://realpython.com/why-close-file-python/ » [ 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 ]April 27, 2022 02:00 PM UTCAbhijeet PalDjango 4.1 adds async-compatible interface to QuerySetThe much-awaited pull request for an async-compatible interface to Queryset just got merged into the main branch of Django.Pull Request -https://github.com/django/django/pull/14843 The Django core team has been progressively adding async support to the framework. Asynchronous views and middlewares were part of the Django 3.1 release and with the latest changes now Django ORM will be able …April 27, 2022 07:53 AM UTCApril 26, 2022Daniel Roy GreenfeldLive Discussion with Sebastián Ramírez (Tiangolo)On April 26th I had a live discussion with Sebastián Ramírez, creator of FastAPI, Typer, SQL Model, and more.To watch the video click here or on the image below.LINKS:tiangolo.comfastapi.tiangolo.comtyper.tiangolo.comsqlmodel.tiangolo.comforethought.ai/forethought.ai/careers/octopusenergy.com/careersApril 26, 2022 10:20 PM UTCPyCoder’s WeeklyIssue #522 (April 26, 2022) #522 – APRIL 26, 2022 View in Browser » Type Hints in Code Supporting Multiple Python Versions The typing module continues to evolve, with new features in every Python version. This can make it tricky if you’re trying to type code that supports multiple Python versions. Learn just what you can do when you need to support Type Hints in multiple versions. ADAM JOHNSON PyCon US 2022: Getting the Most Out of Your Conference Visit Tips for getting the most out of your visit to PyCon US, the world’s biggest Python conference taking place April 27, 2022 to May 3, 2022 in Salt Lake City, Utah. Whether you’re a first-timer or a seasoned attendee, this guide will help you get ready to have a great PyCon. If you’re attending, stop by the Real Python booth and say hello! :) REAL PYTHON Proactively Monitor Python App Uptime with Datadog APM Datadog APM empowers developer teams to identify anomalies, resolve issues, and improve application performance. Easily identify bottlenecks, errors, heavy traffic issues, slow-running queries, and more with end-to-end application tracing and continuous profiling. Start a free Datadog APM trial → DATADOG sponsor Add Additional Attributes to Enum Members in Python Sometimes you want your Enum objects to reference more than just a single piece of data. You can use a tuple but then you have to de-reference it. This article shows a technique used in http.HTTPStatus that you can do in your own code. REDOWAN DELOWAR Building a Django User Management System In this video course, you’ll learn how to extend your Django application with a user management system, complete with email sending and third-party authentication. REAL PYTHON course PyOhio Call for Proposals Open Through May 2 PYOHIO.ORG • Shared by Dave Forgac Discussions Python’s “Type Hints” Are a Bit of a Disappointment to Me HACKER NEWS Where Can I See Examples of Large S/W Architecture? HACKER NEWS Python Jobs Gameful Learning Developer (Ann Arbor, MI, USA) University of Michigan Data & Operations Engineer (Ann Arbor, MI, USA) University of Michigan Python Technical Architect (USA) Blenderbox Academic Innovation Software Developer (Ann Arbor, MI, USA) University of Michigan Software Development Lead (Ann Arbor, MI, USA) University of Michigan Lead Software Engineer (Anywhere) Right Side Up Data Engineer (Chicago, IL, USA) Aquatic Capital Managment More Python Jobs >>> Articles & Tutorials From 30 Lines of Code to 11: Rock Paper Scissors in Python When you’re a beginner you need projects that allow you to practice basic concepts. But do you ever revisit those projects as a more advanced developer? This article looks at one common beginner Python project — implementing Rock Paper Scissors in Python — and how you could approach the game logic from a more advanced perspective. DAVIDAMOS.DEV • Shared by David Amos Python Bidirectional Dictionary Learn about the Bidict library, a bi-directional dictionary where your keys and your values can both be used to look up an item. This can be a useful tool when dealing with mapped data like country code to country name where you want to look up either side of the relationship. CHRISTOPHER TAO Join Our Free Online Community With Anaconda Nucleus Anaconda Nucleus is our education and community engagement platform. The platform features a wealth of data science content ranging from articles to webinars to videos and more. Join to ask questions and engage other data professionals → ANACONDA sponsor Use Python to Send Notifications During Model Training We’ve all been there. Whether you are experimenting with a new fun model or grinding for that Kaggle competition prize pool, it can be hard to leave your models running in peace. Learn how to use Twilio’s API to notify you during your model training. BRADEN RIGGS What is Synthetic Data? Synthetic data is artificially annotated information that is generated by computer algorithms or simulations, commonly used as an alternative to real-world data. Learn where it can be useful and how it helps train your machine learning algorithms. GRETEL.AI • Shared by Mason Egger Python 3.11 Preview: Task and Exception Groups Python 3.11 will be released in October 2022. In this tutorial, you’ll install the latest alpha release of Python 3.11 in order to preview task and exception groups and learn about how they can improve your asynchronous programming in Python. REAL PYTHON Create an Interactive Dashboard With Pandas and hvPlot This article will show you the easiest way to create an interactive dashboard in Python from any Pandas DataFrame. If you already know some Pandas, you can almost immediately use hvPlot .interactive and turn your data into a dashboard. SOPHIA YANG How I Integrated Zapier Into My Django Project Zapier is a no-code tool that takes input from a wide variety of web applications and connects their output to other applications. This article walks you through what you need to do to integrate Zapier with your Django project. AIDAS BENDORAITIS Concurrent Web Scraping With Selenium and Docker Swarm This tutorial shows you how to use Python and Selenium Grid to build a parallel web scraper. By packaging it up in Docker and executing it in a swarm, you can scrape all the things! MICHAEL HERMAN Find Your Next Tech Job Through Hired Hired has 1000s of companies of all sizes who are actively hiring developers, data scientists, mobile engineers, and more. It’s really simple: create a profile with your skills for hiring managers to reach you directly. Sign up today! HIRED sponsor Top 10 VSCode Extensions for More Productive Python Bas’s top 10 VSCode extensions for Python, including tools for indentation management, comments, tests, type hints, docstrings, and more. BAS STEINS Common Python Anti-Patterns to Watch Out For Fifteen code patterns that are problematic in Python and what alternatives to use instead. KOUSHIK THOTA Projects & Code memray: Memory Profiler for Python GITHUB.COM/BLOOMBERG git-gud: Command-Line Game to Learn git GITHUB.COM/BENTHAYER dunk: Prettier Git Diffs GITHUB.COM/DARRENBURNS pandera: Data Validation Library for Pandas Dataframes GITHUB.COM/PANDERA-DEV pypyr: make Alternative for Automation Pipelines GITHUB.COM/PYPYR Events Weekly Real Python Office Hours Q&A (Virtual) April 27, 2022 REALPYTHON.COM PyCon US 2022 April 27 to May 6, 2022 PYCON.ORG PyKla Monthly Meetup April 27, 2022 MEETUP.COM PyStaDa April 27, 2022 PYSTADA.GITHUB.IO SPb Python Drinkup April 28, 2022 MEETUP.COM Happy Pythoning!This was PyCoder’s Weekly Issue #522.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 ]April 26, 2022 07:30 PM UTCSTX Next13 Best Django and Django REST Tutorials in 2022 Thinking of learning Django? You’re already familiar with Python, but want to go further and try something new? Or maybe you already know Django and just wish to boost your qualifications even more? April 26, 2022 03:20 PM UTCCodeGradesHello, World (again)The COVID outbreak has disrupted our world in lots of different ways.For CodeGrades, it meant our face-to-face work with young coders, in London,had to stop.We had been meeting since the Autumn of 2019 to prepare both young coders andtheir ever enthusiastic parents for our initial syllabus of Python grades.Improvised venues includedthe Barbican, co-working spaces, theTate Modernand theRoyal Society of Arts. It was engaging, friendly andthe candidates (no matter their age or level of experience) were a credit tothemselves.They had been building all sorts: from games, to websites to mobile apps. It'ssuch a shame we couldn't complete the courses of study and have folks actuallypresent their projects for grading.We learned a huge amount from this remarkable group of young people and theirparents. Because of their feedback, the syllabus was subsequently refined,various tools were updated (the Mu editor, andPyperCard) and we all naivelylooked forward to the soon-to-be-imminent easing of lock-down here in the UK.Yet that didn't happen, and two year's later, the world has changed.Instead CodeGrades has taken a different direction, and reviving this blog isevidence of this journey.To cut a long story short,Lock-down afforded us the opportunity to connect with many folks in the wider Python community, all over the world, who were interested in our crazy experiment in coding education.They called our bluff about making the work we'd been doing accessible. So we put our code where our mouth is, and have a completely new web based version of CodeGrades.The assessment process has changed, but we believe it is actually better as a result of this adjustment.The new website is completely redesigned, rewritten and feature complete. It is currently undergoing technical alpha testing with trusted invited friends of the project, and we expect an open beta to be released later this summer.It was always our intention for CodeGrades to be accessible to anyone, anywherethere's an internet connection, and lock-down forced our hand. Every cloud hasa silver lining.Finally, this is just the tip of a very large iceberg.For instance, here's a sneak-peek of the rough-cut of our "elevator pitch"video (still in development):Now that various pieces in a very complicated jigsaw puzzle are starting tofit together, expect much more regular updates via this blog, and ourTwitter account.See you soon. :-)April 26, 2022 03:10 PM UTCMike DriscollPython 101 - Creating Multiple ThreadsConcurrency is a big topic in programming. The concept of concurrency is to run multiple pieces of code at once. Python has a couple of different solutions that are built-in to its standard library. You can use threads or processes. In this chapter, you will learn about using threads.When you run your own code, you are using a single thread. If you want to run something else in the background, you can use Python's threading module.In this article you will learn the following:Pros of Using ThreadsCons of Using ThreadsCreating ThreadsSubclassing ThreadWriting Multiple Files with ThreadsNote: This chapter is not meant to be comprehensive in its coverage of threads. But you will learn enough to get started using threads in your application.Let's get started by going over the pros and cons of using threads!Pros of Using ThreadsThreads are useful in the following ways:They have a small memory footprint, which means they are lightweight to useMemory is shared between threads - which makes it easy to share state across threadsAllows you to easily make responsive user interfacesGreat option for I/O bound applications (such as reading and writing files, databases, etc)Now let's look at the cons!Cons of Using ThreadsThreads are not useful in the following ways:Poor option for CPU bound code due to the Global Interpreter Lock (GIL) - see belowThey are not interruptible / able to be killedCode with threads is harder to understand and write correctlyEasy to create race conditionsThe Global Interpreter Lock is a mutex that protects Python objects. This means that it prevents multiple threads from executing Python bytecode at the same time. So when you use threads, they do not run on all the CPUs on your machine.Threads are great for running I/O heavy applications, image processing, and NumPy's number-crunching because they don't do anything with the GIL. If you have a need to run concurrent processes across multiple CPUs, use the multiprocessing module. You will learn about the multiprocessing module in the next chapter.A race condition happens when you have a computer program that depends on a certain order of events to happen for it to execute correctly. If your threads execute something out of order, then the next thread may not work and your application can crash or behave in unexpected ways.Creating ThreadsThreads are confusing if all you do is talk about them. It's always good to familiarize yourself with how to write actual code. For this chapter, you will be using the threading module which uses the _thread module underneath.The full documentation for the threading module can be found here:https://docs.python.org/3/library/threading.htmlLet's write a simple example that shows how to create multiple threads. Put the following code into a file named worker_threads.py:# worker_threads.pyimport randomimport threadingimport timedef worker(name: str) -> None: print(f'Started worker {name}') worker_time = random.choice(range(1, 5)) time.sleep(worker_time) print(f'{name} worker finished in {worker_time} seconds')if __name__ == '__main__': for i in range(5): thread = threading.Thread( target=worker, args=(f'computer_{i}',), ) thread.start()The first three imports give you access to the random, threading and time modules. You can use random to generate pseudo-random numbers or choose from a sequence at random. The threading module is what you use to create threads and the time module can be used for many things related to time.In this code, you use time to wait a random amount of time to simulate your "worker" code working.Next you create a worker() function that takes in the name of the worker. When this function is called, it will print out which worker has started working. It will then choose a random number between 1 and 5. You use this number to simulate the amount of time the worker works using time.sleep(). Finally you print out a message that tells you a worker has finished and how long the work took in seconds.The last block of code creates 5 worker threads. To create a thread, you pass in your worker() function as the target function for the thread to call. The other argument you pass to thread is a tuple of arguments that thread will pass to the target function. Then you call thread.start() to start running that thread.When the function stops executing, Python will delete your thread.Try running the code and you'll see that the output will look similar to the following:Started worker computer_0Started worker computer_1Started worker computer_2Started worker computer_3Started worker computer_4computer_0 worker finished in 1 secondscomputer_3 worker finished in 1 secondscomputer_4 worker finished in 3 secondscomputer_2 worker finished in 3 secondscomputer_1 worker finished in 4 secondsYour output will differ from the above because the workers sleep() for random amounts of time. In fact, if you run the code multiple times, each invocation of the script will probably have a different result.threading.Thread is a class. Here is its full definition:threading.Thread( group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None, )You could have named the threads when you created the thread rather than inside of the worker() function. The args and kwargs are for the target function. You can also tell Python to make the thread into a daemon. "Daemon threads" have no claim on the Python interpreter, which has two main consequences: 1) if only daemon threads are left, Python will shut down, and 2) when Python shuts down, daemon threads are abruptly stopped with no notification. The group parameter should be left alone as it was added for future extension when a ThreadGroup is added to the Python language.Subclassing ThreadThe Thread class from the threading module can also be subclassed. This allows you more fine-grained control over your thread's creation, execution and eventual deletion. You will encounter subclassed threads often.Let's rewrite the previous example using a subclass of Thread. Put the following code into a file named worker_thread_subclass.py.# worker_thread_subclass.pyimport randomimport threadingimport timeclass WorkerThread(threading.Thread): def __init__(self, name): threading.Thread.__init__(self) self.name = name self.id = id(self) def run(self): """ Run the thread """ worker(self.name, self.id)def worker(name: str, instance_id: int) -> None: print(f'Started worker {name} - {instance_id}') worker_time = random.choice(range(1, 5)) time.sleep(worker_time) print(f'{name} - {instance_id} worker finished in ' f'{worker_time} seconds')if __name__ == '__main__': for i in range(5): thread = WorkerThread(name=f'computer_{i}') thread.start()In this example, you create the WorkerThread class. The constructor of the class, __init__(), accepts a single argument, the name to be given to thread. This is stored off in an instance attribute, self.name. Then you override the run() method.The run() method is already defined in the Thread class. It controls how the thread will run. It will call or invoke the function that you passed into the class when you created it. When you create your own run() method in your subclass, it is known as overriding the original. This allows you to add custom behavior such as logging to your thread that isn't there if you were to use the base class's run() method.You call the worker() function in the run() method of your WorkerThread. The worker() function itself has a minor change in that it now accepts the instance_id argument which represents the class instance's unique id. You also need to update the print() functions so that they print out the instance_id.The other change you need to do is in the __main__ conditional statement where you call WorkerThread and pass in the name rather than calling threading.Thread() directly as you did in the previous section.When you call start() in the last line of the code snippet, it will call run() for you itself. The start() method is a method that is a part of the threading.Thread class and you did not override it in your code.The output when you run this code should be similar to the original version of the code, except that now you are also including the instance id in the output. Give it a try and see for yourself!Writing Multiple Files with ThreadsThere are several common use cases for using threads. One of those use cases is writing multiple files at once. It's always nice to see how you would approach a real-world problem, so that's what you will be doing here.To get started, you can create a file named writing_thread.py. Then add the following code to your file:# writing_thread.pyimport randomimport timefrom threading import Threadclass WritingThread(Thread): def __init__(self, filename: str, number_of_lines: int, work_time: int = 1) -> None: Thread.__init__(self) self.filename = filename self.number_of_lines = number_of_lines self.work_time = work_time def run(self) -> None: """ Run the thread """ print(f'Writing {self.number_of_lines} lines of text to ' f'{self.filename}') with open(self.filename, 'w') as f: for line in range(self.number_of_lines): text = f'This is line {line+1}\n' f.write(text) time.sleep(self.work_time) print(f'Finished writing {self.filename}')if __name__ == '__main__': files = [f'test{x}.txt' for x in range(1, 6)] for filename in files: work_time = random.choice(range(1, 3)) number_of_lines = random.choice(range(5, 20)) thread = WritingThread(filename, number_of_lines, work_time) thread.start()Let's break this down a little and go over each part of the code individually:import randomimport timefrom threading import Threadclass WritingThread(Thread): def __init__(self, filename: str, number_of_lines: int, work_time: int = 1) -> None: Thread.__init__(self) self.filename = filename self.number_of_lines = number_of_lines self.work_time = work_timeHere you created the WritingThread class. It accepts a filename, a number_of_lines and a work_time. This allows you to create a text file with a specific number of lines. The work_time is for sleeping between writing each line to simulate writing a large or small file.Let's look at what goes in run():def run(self) -> None: """ Run the thread """ print(f'Writing {self.number_of_lines} lines of text to ' f'{self.filename}') with open(self.filename, 'w') as f: for line in range(self.number_of_lines): text = f'This is line {line+1}\n' f.write(text) time.sleep(self.work_time) print(f'Finished writing {self.filename}')This code is where all the magic happens. You print out how many lines of text you will be writing to a file. Then you do the deed and create the file and add the text. During the process, you sleep() to add some artificial time to writing the files to disk.The last piece of code to look at is as follows:if __name__ == '__main__': files = [f'test{x}.txt' for x in range(1, 6)] for filename in files: work_time = random.choice(range(1, 3)) number_of_lines = random.choice(range(5, 20)) thread = WritingThread(filename, number_of_lines, work_time) thread.start()In this final code snippet, you use a list comprehension to create 5 file names. Then you loop over the files and create them. You use Python's random module to choose a random work_time amount and a random number_of_lines to write to the file. Finally you create the WritingThread and start() it.When you run this code, you will see something like this get output:Writing 5 lines of text to test1.txtWriting 18 lines of text to test2.txtWriting 7 lines of text to test3.txtWriting 11 lines of text to test4.txtWriting 11 lines of text to test5.txtFinished writing test1.txtFinished writing test3.txtFinished writing test4.txtFinished writing test5.txtFinished writing test2.txtYou may notice some odd output like the line a couple of lines from the bottom. This happened because multiple threads happened to write to stdout at once.You can use this code along with Python's urllib.request to create an application for downloading files from the Internet. Try that project out on your own.Wrapping UpYou have learned the basics of threading in Python. In this chapter, you learned about the following:Pros of Using ThreadsCons of Using ThreadsCreating ThreadsSubclassing ThreadWriting Multiple Files with ThreadsThere is a lot more to threads and concurrency than what is covered here. You didn't learn about thread communication, thread pools, or locks for example. However you do know the basics of creating threads and you will be able to use them successfully. In the next chapter, you will continue to learn about concurrency in Python through discovering how multiprocessing works in Python!Related ArticlesPython 101 - Creating Multiple ProcessesPython 201: A Tutorial on ThreadsThis article is based on a chapter from Python 101: 2nd Edition. You can purchase Python 101 on Amazon or Leanpub.The post Python 101 - Creating Multiple Threads appeared first on Mouse Vs Python.April 26, 2022 12:30 PM UTCApril 25, 2022Podcast.__init__Automatically Enforce Software Structures With Powerful Code Modifications Powered By LibCSTProgrammers love to automate tedious processes, including refactoring your code. In order to support the creation of code modifications for your Python projects Jimmy Lai created LibCST. It provides a richly typed and high level API for creating and manipulating concrete syntax trees of your source code. In this episode Jimmy Lai and Zsolt Dollenstein explain how it works, some of the linting and automatic code modification utilities that you can build with it and how to get started with using it to maintain your own Python projects.SummaryProgrammers love to automate tedious processes, including refactoring your code. In order to support the creation of code modifications for your Python projects Jimmy Lai created LibCST. It provides a richly typed and high level API for creating and manipulating concrete syntax trees of your source code. In this episode Jimmy Lai and Zsolt Dollenstein explain how it works, some of the linting and automatic code modification utilities that you can build with it and how to get started with using it to maintain your own Python projects.AnnouncementsHello and welcome to Podcast.__init__, the podcast about Python’s role in data and science.When you’re ready to launch your next app or want to try a project you hear about on the show, you’ll need somewhere to deploy it, so take a look at our friends over at Linode. With the launch of their managed Kubernetes platform it’s easy to get started with the next generation of deployment and scaling, powered by the battle tested Linode platform, including simple pricing, node balancers, 40Gbit networking, dedicated CPU and GPU instances, and worldwide data centers. Go to pythonpodcast.com/linode and get a $100 credit to try out a Kubernetes cluster of your own. And don’t forget to thank them for their continued support of this show!Your host as usual is Tobias Macey and today I’m interviewing Zsolt Dollenstein and Jimmy Lai about LibCST, a concrete syntax tree parser and serializer library for PythonInterviewIntroductionsHow did you get introduced to Python?Can you describe what LibCST is and the story behind it?How does a concrete syntax tree differ from an abstract syntax tree?What are some of the situations where the preservation of the exact structure is necessary?There are a few other libraries in Python for creating concrete syntax trees. What was missing in the available options that made it necessary to create LibCST?What are the use cases that LibCST is focused on supportingCan you describe how LibCST is implemented?How have the design and goals of the project changed or evolved since you started working on it?How might I use LibCST for something like restructuring a set of modules to move a function definition while maintaining proper imports?How do the capabilities of LibCST for codemodding compare to the Rope framework?What are some other workflows that someone might build with LibCST?What are some of the ways that LibCST is being used in your own work?What are the most interesting, innovative, or unexpected ways that you have seen LibCST used?What are the most interesting, unexpected, or challenging lessons that you have learned while working on LibCST?When is LibCST the wrong choice?What do you have planned for the future of LibCST?Keep In TouchZsoltzsol on GitHubLinkedInJimmyjimmylai on GitHubLinkedInPicksTobiasOsprey Manta BackpackZsoltAutotransformGleanJimmyPaying down technical debtClosing AnnouncementsThank you for listening! Don’t forget to check out our other show, the Data Engineering Podcast for the latest on modern data management.Visit the site to subscribe to the show, sign up for the mailing list, and read the show notes.If you’ve learned something or tried out a project from the show then tell us about it! Email [email protected]) with your story.To help other people find the show please leave a review on iTunes and tell your friends and co-workersLinksLibCSTCartalib2to3Abstract Syntax TreeConcrete Syntax TreePyreParsoCythonPodcast EpisodemypycRopeFlake8Podcast EpisodePylintESLintFixitMonkeyTypePodcast EpisodeThe intro and outro music is from Requiem for a Fish The Freak Fandango Orchestra / CC BY-SAApril 25, 2022 07:20 PM UTCSebastian Pölsterlscikit-survival 0.17.2 releasedI’m pleased to announce the release ofscikit-survival 0.17.2.This release fixes several small issues with packaging scikit-survivaland the documentation.For a full list of changes in scikit-survival 0.17.2, please see therelease notes.Most notably, binary wheels are now available for Linux, Windows, and macOS (Intel).This has been possible thanks to the cibuildwheelbuild tool, which makes it incredible easy to use GitHub Actions for buildingthose wheels for multiple versions of Python.Therefore, you can now use pip without building everything from source bysimply runningpip install scikit-survivalAs before, pre-built conda packages are available too, by running conda install -c sebp scikit-survivalSupport for Apple Silicon M1Currently, there are no pre-built packages for Mac with Apple Silicon M1hardware (also known as macos/arm64).There are two main reasons for that. The biggest problem is the lack ofCI servers that run on Apple Silicon M1. This makes it difficult tosystematically test scikit-survival on such hardware.Second, some of scikit-survival’s dependencies do not offer wheelsfor macos/arm64 yet, namely ecosand osqp.However, conda-forge figured out a way tocross-compile packages, and do offerscikit-survival for macos/arm64.I tried to adapt their conda recipe, but failed to achieve a workingcross-compilation process so far.Cross-compiling with cibuildwheel would be an alternative, but currentlydoesn’t make much sense if run-time dependencies ecos and osqp do notprovide wheels for macos/arm64.I hope these issues can be resolved in the near future.April 25, 2022 06:14 PM UTCReal PythonCombining Data in Pandas With merge(), .join(), and concat()The Series and DataFrame objects in pandas are powerful tools for exploring and analyzing data. Part of their power comes from a multifaceted approach to combining separate datasets. With pandas, you can merge, join, and concatenate your datasets, allowing you to unify and better understand your data as you analyze it. In this tutorial, you’ll learn how and when to combine your data in pandas with:merge() for combining data on common columns or indices.join() for combining data on a key column or an indexconcat() for combining DataFrames across rows or columnsIf you have some experience using DataFrame and Series objects in pandas and you’re ready to learn how to combine them, then this tutorial will help you do exactly that. If you’re feeling a bit rusty, then you can watch a quick refresher on DataFrames before proceeding.You can follow along with the examples in this tutorial using the interactive Jupyter Notebook and data files available at the link below: Download the notebook and data set: Click here to get the Jupyter Notebook and CSV data set you’ll use to learn about Pandas merge(), .join(), and concat() in this tutorial.Note: The techniques that you’ll learn about below will generally work for both DataFrame and Series objects. But for simplicity and concision, the examples will use the term dataset to refer to objects that can be either DataFrames or Series.pandas merge(): Combining Data on Common Columns or IndicesThe first technique that you’ll learn is merge(). You can use merge() anytime you want functionality similar to a database’s join operations. It’s the most flexible of the three operations that you’ll learn.When you want to combine data objects based on one or more keys, similar to what you’d do in a relational database, merge() is the tool you need. More specifically, merge() is most useful when you want to combine rows that share data. You can achieve both many-to-one and many-to-many joins with merge(). In a many-to-one join, one of your datasets will have many rows in the merge column that repeat the same values. For example, the values could be 1, 1, 3, 5, and 5. At the same time, the merge column in the other dataset won’t have repeated values. Take 1, 3, and 5 as an example.As you might have guessed, in a many-to-many join, both of your merge columns will have repeated values. These merges are more complex and result in the Cartesian product of the joined rows. This means that, after the merge, you’ll have every combination of rows that share the same value in the key column. You’ll see this in action in the examples below.What makes merge() so flexible is the sheer number of options for defining the behavior of your merge. While the list can seem daunting, with practice you’ll be able to expertly merge datasets of all kinds. When you use merge(), you’ll provide two required arguments:The left DataFrame The right DataFrameAfter that, you can provide a number of optional arguments to define how your datasets are merged:how defines what kind of merge to make. It defaults to 'inner', but other possible options include 'outer', 'left', and 'right'.on tells merge() which columns or indices, also called key columns or key indices, you want to join on. This is optional. If it isn’t specified, and left_index and right_index (covered below) are False, then columns from the two DataFrames that share names will be used as join keys. If you use on, then the column or index that you specify must be present in both objects.left_on and right_on specify a column or index that’s present only in the left or right object that you’re merging. Both default to None.left_index and right_index both default to False, but if you want to use the index of the left or right object to be merged, then you can set the relevant argument to True.suffixes is a tuple of strings to append to identical column names that aren’t merge keys. This allows you to keep track of the origins of columns with the same name.These are some of the most important parameters to pass to merge(). For the full list, see the pandas documentation.Note: In this tutorial, you’ll see that examples always use on to specify which column(s) to join on. This is the safest way to merge your data because you and anyone reading your code will know exactly what to expect when calling merge(). If you don’t specify the merge column(s) with on, then pandas will use any columns with the same name as the merge keys. How to Use merge()Before getting into the details of how to use merge(), you should first understand the various forms of joins: inner outerleftrightNote: Even though you’re learning about merging, you’ll see inner, outer, left, and right also referred to as join operations. For this tutorial, you can consider the terms merge and join equivalent.You’ll learn about these different joins in detail below, but first take a look at this visual representation of them:Read the full article at https://realpython.com/pandas-merge-join-and-concat/ » [ 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 ]April 25, 2022 02:00 PM UTCMike DriscollPyDev of the Week: Julien PalardThis week we welcome Julien Palard (@sizeof) as our PyDev of the Week! Julien is a core developer of the Python programming language and a Python trainer. Julien is also the creator of HackInScience, a Python learning platform as well as an organizer for AFPy, the French Python user group. Julien did the French translation of the Python documentation!You can see what Julien has been up to over on GitHub or by checking out his website.Let's spend some time getting to know Julien better!Can you tell us a little about yourself (hobbies, education, etc):As far as I can remember I started writing code around age 16, by writing games on calculators to share with fellow students. It was already kind of free and open-source, shared from calculators to calculators (but I had nothing to upload to a computer, so I have no backup, I'm sad, but the code was probably particularly ugly anyway).At this time I also learned dancing, which become a big big hobby: I started with Rock'n Roll, then Lindy Hop, Boogie, Charleston Tandem, Balboa, ... then I shifted to Latin dances for a few other years. At my "top" I was dancing for 24h a week, I don't have as much "free" time now ? Fun fact (I bet) for me dancing moves were stored in my mind as a digraph, like "I can go from this position to this position using any of those moves", dancing were then just a random walk of the digraph. It's probably the "developer view of dancing" (if it's a thing) but it gave me more movement liberty using this representation than the normal "named sequence of moves" everyone is using.After writing a ton of bad code, I then learned C at school and enjoyed it a lot! I wrote a few more or less interesting things in C, like logtop. Back then I also wrote a vt100-emulator during my daily commute in the Paris subway, for fun (or to better understand vt100? I don't remember).Why did you start using Python?Haha! After learning C I set myself a challenge: learn a new language every year, just to open my mind. I started learning Erlang (I loved it!) then Lisp because why not, and then Python, if I remember the order correctly. I loved Python so much that I stopped learning a new language per year (I bet I should continue).What other programming languages do you know and which is your favorite?So hum... JavaScript (I loved prototype-based languages at the time! I even tried learning LISAAC...), PHP (for food), C (), Erlang, Lisp, C# (the few first releases, I remember it as a well designed language), prolog (it counts if I tried it just once?), bash.I had to write some Java (never appreciated it), some ASM (at school mainly, appreciated it), and another language that I won't even name (some will guess it, please don't name it, they don't deserve it. Here's a single hint: they use women in sexy outfits to advertise their IDE...).My favorite? I think I don't remember how to write many things with it, but I have great memories of using Erlang, it was enlightening, if you are bored: learn it.What projects are you working on now?I don't know. I think I can't really focus on a "project", I think my github reflects that well so I'll not try to be exhaustive here.The biggest is maybe the revival of the translation of the Python documentation in french. I say revival because it really started around year 2000, while I revived it around year 2015. I'm proud of this project because it paved the way for people around the world to translate the Python doc in other languages, and as of 2022 docs.python.org lists 7 translations! I'm also proud because it's now used by many french schools to teach Python to many french students that at their age are not fluent enough in English to read the doc in English.I also work on https://hackinscience.org, a free, open-source, ad-less, tracker-less, collection of Python exercises with live feedback, as of 2022 I have around 1k active users monthly, and see 10k resolved exercises per month, try it! I'm proud of this project because it starts to be used by many schools, in France but in other countries too!But when I say I can't really focus I'm serious: I contribute to OpenStreetMap, to a list of french public domain names, I help the French PUG (AFPy) with their infra and organizing meetups, I'm currently trying to create a sphinx-linter to replace `make -C Doc suspicious` and cpython/Doc/tools/rstlint.py with something more reusable and with more contributors...Which Python libraries are your favorite (core or 3rd party)?I'd say, in the stdlib: argparse, and out of the stdlib: tqdm.Both make a very good job to hide the complexity of the task they handle, which I appreciate. For argparse I appreciate the fact that it make us describe the arguments instead of providing us instructions to parse them. We need more of this kind of abstraction of complexity.But I bet if you ask me this question every week you'll have a different answer every week!How did you end up translating the Python documentation to French?That's a good question! I bet I was bored in the Parisian subway and was searching for a useful thing to kill the time. Translating is a perfect time killer: it's many micro-tasks, so it can be done without caring about context switching. Or it was a trick to force me to read the whole doc, I won't tell, but I learned a lot while doing so!What challenges did you overcome during the translation process?To stop thinking I can do it alone. I'm probably not "an introvert dev" but it's not my first idea to build a social group around a project neither. But at least this project taught me human interaction are priceless (a big thanks to everyone that jumped in the translation project!!).To conclude I'd like to say: « Writing code is like writing poetry: if you don't share it there's a problemThanks for doing the interview, Julien!The post PyDev of the Week: Julien Palard appeared first on Mouse Vs Python.April 25, 2022 12:30 PM UTC RSS feed Titles Only Powered by Planet! Other Python Planets Python Summer of Code Planet Python Francophone Planet Python Argentina Planet Python Brasil Planet Python Poland Python Libraries OLPC PySoy SciPy SymPy Twisted Python/Web Planets CherryPy Django Community Plone Turbogears Other Languages Haskell Lisp Parrot Perl Ruby Databases MySQL PostgreSQL Subscriptions [OPML feed]"Mathspp Pydon'ts""Menno's Musings""Michael J.T. O'Kelly""Morphex's Blogologue""Speno's Pythonic Avocado""William's Journal"2degreesA. Jesse Jiryu DavisABlog for SphinxAahzAbhijeet PalAbu Ashraf MasnunAdam PletcherAgendaless ConsultingAhmed BouchefraAl-Ahmadgaid AsaadAlec MunroAlex GrönholmAlex MorozovAlexander LimiAlexandre ConradAlexandre VassalottiAlexey EvseevAllison KapturAmjith RamanujamAmvTekAnarcatAnatoly TechtonikAndre RobergeAndrea GrandiAndrew DalkeAndriy KornatskyyAndy DustmanAndy R. TerrelAnna Martelli RavenscroftAnthony BaxterAnton BelyaevAnton BobrovAnwesha DasArmin RonacherArtem GolubinArtem RysAshish VidyarthiAstro Code SchoolAutomating OSINTAwesome Python ApplicationsBaiju MuthukadanBajusz TamásBeDjangoBen BassBen CookBen RouschBenjamin PetersonBenji YorkBertrand MathieuBhavin GandhiBhishan BhandariBioPython NewsBit of CheeseBojan MihelacBrandon RhodesBreadcrumbsCollectorBrendan ScottBrett CannonBrian OkkenBruno OliveiraBruno RochaCaktus Consulting GroupCalvin ChengCalvin SpealmanCarl ChenetCarl DüvelCarl TrachteCarlos Eduardo de PaulaCasey DuncanCatherine DevlinChing-Hwa YuChris HagerChris MilesChris MitchellChris MoffittChris RoseChris WarrickChristian HeimesChristian ScholzChristoph ZwerschkeCodeGradesCodeSnipersCodementorCodersLegacyCoding DietCorey GallonCorey GoldbergCormoran ProjectCross-Platform Command Line ToolsCubicWebCurtis MillerDSPIllustrations.comDaPythonistaDaily Tech Video (Python)Dallas Fort Worth PythoneersDan CrostaDan StrombergDan YeawDaniel BaderDaniel NouriDaniel Roy GreenfeldData Community DCData SchoolDave BeazleyDavid AmosDavid CaronDavid GoodgerDavid LindelofDavid MacIverDavid MalcolmDavid SzottenDavide MoroDavy MitchellDavy WybiralDenis KurovDjango WeblogDjango WeeklyDjangostarsDoing Math with PythonDoug HellmannDougal MatthewsDuncan McGreggorEd CreweEdward K. ReamEli BenderskyEniram Ltd.Eray Özkural (examachine)Erik MarsjaEtienne DesautelsEuroPythonEuroPython SocietyEvenniaEveryday SuperpowersFabio ZadroznyFilip WasilewskiFilipe SaraivaFlavio CoelhoFlavio PercocoFloris BruynoogheFrank WierzbickiFrançois DionFrançois MarierFrederik RietdijkFrom Python Import PodcastFull Stack PythonGaël VaroquauxGeorges DubusGhaandee on ITGiampaolo RodolaGiulio FidenteGlenn FranxmanGlyph LefkowitzGo DehGocept WeblogGodson GeraGraeme CrossGraham DumpletonGraham WheelerGrant BaillieGrant RettkeGreg TaylorGrig GheorghiuGrzegorz ŚliwińskiGuido van RossumGustavo NareaGustavo NiemeyerGökhan SeverHernan GreccoHilary MasonHolger KrekelHolger PetersHumberto RochaHynek SchlawackIan OzsvaldIlian IlievImport PythonInspired PythonIonel Cristian MariesIronPython-URLsIslandTIsrael FruchterItamar Turner TrauringItsMyCodeIvan VelichkoJ. Pablo FernándezJack DiederichJacob PerkinsJahongir RahmonovJaime BueltaJamal MoirJames BennettJanusworxJarrod MillmanJean-Paul CalderoneJeff BisbeeJeff BradberryJeff HinrichsJeff ShellJeremy EpsteinJeremy HyltonJim FultonJoe AbbateJoe PitzJohan DahlinJohn BurnsJohn CookJohn JacobsenJohn Ludhi/nbshare.ioJon PariseJonathan EllisJonathan HarringtonJonathan HartleyJonathan StreetJorgen SchäferJuan Manuel ContrerasJulien DanjouJulien TayonJuri PakasteJust a little PythonJustin MayerKai LautaporttiKarim ElghamrawyKay HayenKay SchluehrKelly YanceyKodnitoKogan DevKonrad DelongKoodaamoKristján Valur JónssonKriti GodeyKulbir SainiKumar McMillanKumar Vipin YadavKushal DasKároly NagyLAAC TechnologyLaurent SzysterLeigh HoneywellLennart RegebroLeonhard VogtLintel TechnologiesLinux StansListenDataLogilabLow Kian SeongLuca BottiLucas CimonLudovic GascLudvig EricsonLuke PlantMaciej FijalkowskMade With MuMahmoud HashemiMalthe BorchMarc RichterMarc-André LemburgMarcos DioneMarius GedminasMark DufourMark McLoughlinMark McMahonMartijn PietersMartin FitzpatrickMats KindahlMatt LaymanMatthew RocklinMatthew RollingsMatthew WilsonMatthew WrightMattias BrändströmMauvewebMichael BeckerMichael DroettboomMichael FoordMichael NelsonMichal KwiatkowskiMichał BultrowiczMichele SimionatoMichy AliceMike C. FletcherMike DriscollMike MüllerMikhail KorobovMikko OhtamaaMirek DługoszMitchell GarnaatMitya SirenefMontreal Python User GroupMoshe ZadkaMoya ProjectMozilla Web DevelopmentMuharem HrnjadovicMycliNadav SametNaomi CederNatan ZabkarNed BatchelderNeil SchemenauerNick CoghlanNick Craig-WoodNick EffordNick JanetakisNicola IarocciNicolas DumazetNicolas ParisNigel BabuNikolaNikolaos DiamantisNot Invented HereNsukami PatrickObey the Testing GoatOfososOmaha Python Users GroupOndřej ČertíkPaolo AmorosoPaolo MelchiorrePathwrightPatrice NeffPatrick KennedyPaul EverittPaul HarrisonPaul RedmanPaweł FertykPedro LimaPeter BengtssonPeter EisentrautPeter FankhänelPeter HarkinsPeter HoffmannPhil HasseyPhilip JenveyPhilipp von WeitershausenPhilippe NormandPhillip J. EbyPodcast.__init__Polyglot.Ninja()Possbility and ProbabilityPradeep GowdaPranav PandeyPraveen GollakotaProgramizProgramming Ideas With JakePrzemysław KołodziejczykPyATL BytecodePyBitesPyCharmPyCoder’s WeeklyPyConPyPyPyTennesseePython 4 KidsPython 411 PodcastPython AdvocacyPython AnywherePython BytesPython Celery - Weekly Celery Tutorials and How-tosPython CirclePython DataPython DiaryPython Does What?!Python Engineering at MicrosoftPython GUIsPython InsiderPython MorselsPython Piedmont Triad User GroupPython PoolPython Software FoundationPython SweetnessPython User GroupsPython for BeginnersPython on KaranPython with MyoPython(x,y) NewsPythonClub - A Brazilian collaborative blog about PythonPythonDebugging.comPythonicityPythonologyPython⇒SpeedPéter SzabóPéter ZsoldosQuansight Labs BlogR David MurrayRMOTRRalph BeanRam RachumRandell BenavidezRandle TaylorRandy ZwitchRaymond HettingerRead the DocsReal PythonRed Hat DevelopersRene DudfieldReuven LernerRichard TewRichard WallRickard LindbergRob GalanakisRobert CollinsRobert ZarembaRobin ParmarRobin WilsonRodrigo AraújRoseHosting BlogRuslan SpivakRyan CoxS. LottS. R. KrishnanSDJournalSPE WeblogSTX NextSalim FadhleySandipan DeySandro TosiSean McGrathSebastian PölsterlSebastian WitowskiSelena DeckelmannSenthil KumaranShannon -jj BehrensShiningPandaSimeon FranklinSimeon VisserSimonSimon BrunningSimon WittberSimple is Better Than ComplexSoftFormanceSpeed MattersSpike ekipSSpyder IDEStack AbuseStanislas MorbieuStarzel.deStefan BehnelStefan ScherfkeStein Magnus JodalStephen FergSteve HoldenSteven KlassStuart Gordon ReidStéphane WirtelSumana Harihareswara - Cogito, Ergo SumanaSuresh Dasari/Tutlane.comSwisscom ICTTalk Python to MeTaylor EdmistonTechBeamers PythonTechiediaries - DjangoTerri OdaTerry JonesTest and CodeTestDriven.ioThe Data ScientistThe Digital CatThe No Title® Tech BlogThe Occasional OccurrenceThe Open SourcererThe Parcon BlogThe Python Coding BlogThe Python PapersThe Three of WandsThibauld NionThisHosting.RocksThomas GuestThomas Vander SticheleTibo BeijenTim Arnold / reachtimTim GilbertTim KnappTim LesherTobias IvarssonTom ChristieTomasz DucinTomaž MurausTomer FilibaTony BreyalToshio KuratomiTravis OliphantTrey HunnerTryton NewsTurnkey LinuxTwisted Matrix LabsV.S. BabuVarun NischalVasudev RamVinay SajipVinay Sajip (Logging)Vinayak MehtaVirgil DuprasVladimir PerićWayne WitzelWeekly Python ChatWeekly Python StackOverflow ReportWes MasonWesley ChunWill Kahn-GreeneWill McGuganWill PierceWilliam MinchinWilliam ReadeWing TipsWingwareWyatt BaldwinYaniv AkninYann LarrivéeYuval GreenfieldZaki AkhmadZato BlogZero to MasteryZero-with-Dot (Oleg Żero)ZeroDBbottlepy-devcodebojedeath and gravityeGenix.comhypothesis.works articleskdev-pythonmeejah.canl-projectpgclipy.CheckIOpythonwisequtebrowser development blogsaaj/recollectionscikit-learntestmontryexceptpassÉric AraujoŁukasz Langa To request addition or removal: Open an issue on github