Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book

#272: The tools episode

Published Thu, Feb 24, 2022, recorded Wed, Feb 23, 2022

Watch the live stream:

Watch this episode on YouTube
Play on YouTube
Watch the live stream replay

About the show

Sponsor: Brought to you by FusionAuth - check them out at

Special guest: Calvin Hendryx-Parker

Brian #1: Why your mock still doesn’t work

  • Ned Batchelder
  • Some back story: Why your mock doesn’t work
    • a quick tour of Python name assignment
    • importing
    • difference between from foo import bar and import foo w.r.t mocking
    • punchline: “Mock it where it’s used”
  • Now, Why your mock still doesn’t work talks about
    • using @patch decorator (also applies to @patch.object decorator)
    • and utilizing mock_thing1, mock_thing2 parameters to test
    • you can change the return value or an attribute or whatever. normal mock stuff.
    • But…. the punchline…. be careful about the order of patches.
  • It needs to be
        def test_(mock_thing1, mock_thing2):
  • Further reading:

Michael #2: pls

  • via Chris May
  • Are you a developer who uses the terminal? (likely!)
  • ls/l are not super helpful. There are replacements and alternatives
  • But if you’re a dev, you might want the most relevant info for you, so enter pls
  • See images in Michael’s tweets [1, 2].
  • You must install nerdfonts and set your terminal’s font to them

Calvin #3: Kitty

  • Cross platform GPU accelerated terminal (written in Python
  • Extended with Kittens written in Python
  • Super fast rendering
  • Has a rich set of plugins available for things like searching the buffer with fzf

Brian #4: Futures and easy parallelisation

  • Jaime Buelta
  • Code example for quick scripts to perform slow tasks in parallel.
  • Uses concurrent.futures and ThreadPoolExecutor.
  • Starts with a small toy example, then goes on to a requests example to grab a bunch of pages in parallel.
    • The call to executor.submit() sets up the job.
      • This is done in a list comprehension, generating a list of futures.
    • The call to futures.result() on each future within the list is where the blocking happens. Since we want to wait for all results, it’s ok to block on the first, second, etc.
  • Nice small snippet for easy parallel work.
  • Example:
        from concurrent.futures import ThreadPoolExecutor
        import time
        import requests
        from urllib.parse import urljoin
        NUM_WORKERS = 2
        executor = ThreadPoolExecutor(NUM_WORKERS)
        def retrieve(root_url, path):
            url = urljoin(root_url, path)
            print(f'{time.time()} Retrieving {url}')
            result = requests.get(url)
            return result
        arguments = [('', 'search'),
                     ('', 'login'),
                     ('', 'international')]
        futures_array = [executor.submit(retrieve, *arg) for arg in arguments]
        result = [future.result() for future in futures_array]

Michael #5: pgMustard

  • So you have a crappy web app that is slow but don’t know why.
  • Is it an N+1 problem with an ORM?
  • Is it a lack of indexes?
  • If you’re using postgres, check out pgMustard: A simple yet powerful tool to help you speed up queries
  • This is a paid product but might be worthwhile if you live deeply in postgres.

Calvin #6: bpytop

  • Great way to see what is going on in your system/server
  • Shows nice graphs in the terminal for system performance such as CPU and Network traffic
  • Support themes and is fast and easy to install with pipx
  • Michael uses Glances which is fun too. Calvin used to be a heavy Glances user until he saw the light 🙂



  • pytest book is officially no longer Beta, next is printing, expected paper copy ship date at March 22, although I’m hoping earlier.
  • PyCamp Spain is April 15-18: a weekend that includes 4 days and 3 nights with full board (breakfast, lunch and dinner) in Girona, Spain


  • Python Web Conference 2022 ← bigger and better than ever!


Joke: Killer robots

Want to go deeper? Check our projects