DiscoverPython Bytes#412 Closing the loop
#412 Closing the loop

#412 Closing the loop

Update: 2024-12-02
Share

Description

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

Comments 
00:00
00:00
x

0.5x

0.8x

1.0x

1.25x

1.5x

2.0x

3.0x

Sleep Timer

Off

End of Episode

5 Minutes

10 Minutes

15 Minutes

30 Minutes

45 Minutes

60 Minutes

120 Minutes

#412 Closing the loop

#412 Closing the loop

Michael Kennedy and Brian Okken