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

Episode #296: pip: Constrain your excitement

Published Tue, Aug 9, 2022, recorded Tue, Aug 9, 2022.

Watch the live stream:

About the show

Sponsored by the IRL Podcast from Mozilla

Brian #1: Pip constraints files

  • by luminousmen
  • You can put some constraints on your dependencies with a constraints file.
  • “Constraints files are requirements files that only control which version of a requirement is installed, not whether it is installed or not. “
  • Syntax is a subset of requirements.txt syntax
    • but all the restrictions seem reasonable, considering
      • must have a name
      • can’t be editable
      • can’t specify extras (that one is maybe slightly weird)
  • You can put --constraint constraints.txt right at the top of your requirements.txt file
  • or specify it on command line,
    • pip install --constraint constraints.txt -r requirements.txt
  • Or, my favorite, stick it at the top of file.
    • yes. pip-compile correctly handles constraints when generating requirements.txt.
  • Example
    • --constraint constraints.txt typer
    • constraints.txt click<8.1.3
    • Output from pip-compile
      # This file is autogenerated by pip-compile with python 3.10
      # To update, run:
      #    pip-compile
          # via
          #   -c constraints.txt
          #   typer
          # via -r

Michael #2: async-cache

  • A caching solution for asyncio
  • Quite simple but looks effective and flexible too
  • Example:
    # TTL Cache
    from cache import AsyncTTL
    @AsyncTTL(time_to_live=60, maxsize=1024)
    async def func(*args, **kwargs):
        time_to_live : max time for which a cached result  is valid
        maxsize : max number of results that are cached.
                    if  max limit  is reached the oldest result  is deleted.

Brian #3: Organize Python code like a PRO

  • Guilherme Latrova
  • Yes, this is one author’s opinion. but…
    • lots of great advice
    • nothing too weird
    • no tool recommendations
  • Recommendations of note
    • keep a src dir.
      • A cool and simple reason: it keeps your source code together in alphabetized IDEs.
    • file/module names: plural except for config, main, core, or similar
      • slightly weird tangent that there are no files, there are modules. ok, whatever.
      • Also talking about directories as main modules. odd. but ok.
    • functions/methods should be verbs
    • variables/constants should be nouns
    • Class names should be singular, unless the class really represents a container
    • The __name__ == "__main__" trick for modules.
    • The entry point trick for modules/packages so that -m mymodule does something.
  • -

Michael #4: keyring

  • via Trent
  • The Python keyring library provides an easy way to access the system keyring service from python. It can be used in any application that needs safe password storage.
  • It’s also helpful in that it allows you to write your own backends. Useful for testing.
  • Basically create a dummy keychain that stores to a pytest temp_path fixture instead of cluttering the real keychain.
  • You could potentially write a backend to interact with any service such as 1Password.



  • I’m taking a class on FastAPI. The instructor is awesome!
  • Also, editing some pytest course video.



  • from a dad-jokes repo
    • Q: How do programming pirates pass method parameters?
    • A: Varrrrarrrgs.
    • Q: How do you get the code for the bank vault?
    • A: You checkout their branch.
    • "Unfortunately these jokes only work if you git them."
  • Screw driver

Want to go deeper? Check our projects