Python Bytes is a weekly podcast hosted by Michael Kennedy and Brian Okken. The show is a short discussion on the headlines and noteworthy news in the Python, developer, and data science space.

#412 Closing the loop

December 02, 2024 00:26:00 26.43 MB Downloads: 0
Topics covered in this episode:
Watch on YouTube

About the show

Sponsored by us! Support our work through:

Connect with the hosts

Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too.

Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.

Brian #1: Loop targets

  • Ned Batchelder
  • I don’t think I would have covered this had it not been the surprising opposition to Ned’s code.
  • Here’s the snippet:

    params = {
      "query": QUERY,
      "page_size": 100,
    }
    *# Get page=0, page=1, page=2, ...*
    **for** params["page"] in itertools.count():
      data = requests.get(SEARCH_URL, params).json()
      **if** not data["results"]:
        **break**
      ...
    
  • Ned is utilizing the assignment in the for loop to use the value of count() and store it into the params["page"].

  • The article includes another version with a temp variable page_num, which I think the naysayers would prefer.
  • But frankly, I think both are fine. Why not put the value right where you want it?

Michael #2: asyncstdlib

  • The asyncstdlib library re-implements functions and classes of the Python standard library to make them compatible with async callables, iterables and context managers.
  • It is fully agnostic to async event loops and seamlessly works with asyncio, third-party libraries such as trio, as well as any custom async event loop.
  • Full set of async versions of advantageous standard library helpers, such as zip, map, enumerate, functools.reduce, itertools.tee, itertools.groupby and many others.
  • Safe handling of async iterators to ensure prompt cleanup, as well as various helpers to simplify safely using custom async iterators.
  • Small but powerful toolset to seamlessly integrate existing sync code into async programs and libraries.

Brian #3: Bagels: TUI Expense Tracker

  • Jax Tam
  • “Bagels expense tracker is a TUI application where you can track and analyse your money flow, with convenience oriented features and a complete interface.

  • Why an expense tracker in the terminal? I found it easier to build a habit and keep an accurate track of my expenses if I do it at the end of the day, instead of on the go. So why not in the terminal where it's fast, and I can keep all my data locally?”

  • Who hasn’t wanted to write their own expense tracker?

  • This implementation is fun for lots of reasons
    • It’s still new and pretty small, so forking it for your own uses should be easy
    • Built on textual is fun
    • install instructions based on uv tool seems to be the new normal:
      • uv tool install --python 3.13 bagels
    • test suite started
    • pretty useful as is, actually
    • Nice that it includes a roadmap of future goals
    • Would be a fun project to help out with for anyone looking for anyone looking for a shiny new codebase to contribute to.

Michael #4: rloop: An AsyncIO event loop implemented in Rust

  • An AsyncIO event loop implemented in Rust
  • From Giovanni Barillari, Creator of Granian
  • RLoop is an AsyncIO event loop implemented in Rust on top of the mio crate.
  • Disclaimer: This is a work in progress and definitely not ready for production usage.
  • Run asyncio.set_event_loop_policy(rloop.EventLoopPolicy()) and done.
  • Similar to uvloop.

Extras

Brian:

Michael:

Joke: CTRL + X onion