Python Bytes
Python Bytes
Jun 9, 2021
#237 Separate your SQL and Python, asynchronously with aiosql
Play • 40 min

Watch the live stream:

Watch on YouTube

About the show

Sponsored by Sentry:

  • Sign up at pythonbytes.fm/sentry
  • And please, when signing up, click Got a promo code? Redeem and enter PYTHONBYTES

Special guest: Mike Groves

Michael #1: Textual

  • Textual (Rich.tui) is a TUI (Text User Interface) framework for Python using Rich as a renderer.
  • Rich TUI will integrate tightly with its parent project, Rich.
  • This project is currently a work in progress and may not be usable for a while.

Brian #2: Pinning application dependencies with pip-tools compile

  • via John Hagen
  • pip-tools has more functionality than this, but compile alone is quite useful
  • Start with a loose list of dependencies in requirements.in:
    rich
  • Can have things like >= and such if you have fixed dependencies.
  • Now pip install pip-tools, and pip-compile requirements.in
  • or python -m piptools compile requirements.in
    • both have same effect.
  • Now you’ll have a requirements.txt file with pinned dependencies:
    # autogenerated by: pip-compile requirements.in
    click==7.1.2
        # via typer
    colorama==0.4.4
        # via rich
    commonmark==0.9.1
        # via rich
    pygments==2.9.0
        # via rich
    rich==10.2.2
        # via -r requirements.in
    typer==0.3.2
        # via -r requirements.in
  • Now, do the same with a dev-requirements.ini to create dev-requirements.txt.
  • Then, of course:
    - `pip install -r requirements.txt`
    - `pip install -r dev-requirements.txt`
    - And test your application.
    - All good? Push changes.
  • To force pip-compile to update all packages in an existing requirements.txt, run pip-compile --upgrade.
  • John provided an example project that uses this workflow: python-blueprint

Mike #3: Pynguin

  • Automated test generation
  • Pynguin is a framework that allows automated unit test generation for Python. It is an extensible tool that allows the implementation of various test-generation approaches.

Michael #4: Python Advisory DB

  • via Brian Skinn
  • A community owned repository of advisories for packages published on pypi.org.
  • Much of the existing set of vulnerabilities are collected from the National Vulnerability Database CVE feed.
  • Vulnerabilities are integrated into the Open Source Vulnerabilities project, which provides an API to query for vulnerabilities.
  • Longer term, we are working with the PyPI team to build a pipeline to automatically get these vulnerabilities [listed] into PyPI.
  • Tracks known security issues with the packages, for example:
    PYSEC-2020-28.yaml
    id: PYSEC-2020-28
    package:
      name: bleach
      ecosystem: PyPI
    details: In Mozilla Bleach before 3.12, a mutation XSS in bleach.clean when RCDATA
      and either svg or math tags are whitelisted and the keyword argument strip=False.
    affects:
      ranges:
      - type: ECOSYSTEM
        fixed: 3.1.2
      versions:
      - '0.1'
      - 0.1.1
      - 0.1.2
      - '0.2'
    ...

Brian #5: Function Overloading with singledispatch and multipledispatch

  • by Martin Heinz
  • I kinda avoid using the phrase “The Correct Way to …”, but you do you, Martin.
  • In C/C++, we can overload functions, which means multiple functions with the same name but different parameter types just work.
  • In Python, you can’t do that automatically, but you can do it.
  • It’s in the stdlib with functools and singledispatch:
    from functools import singledispatch
    from datetime import date, time

    @singledispatch
    def format(arg):
        return arg

    @format.register
    def _(arg: date):
        return f"{arg.day}-{arg.month}-{arg.year}"

    @format.register(time)
    def _(arg):
        return f"{arg.hour}:{arg.minute}:{arg.second}"
  • Now format works like two functions:
    print(format(date(2021, 5, 26)))
    # 26-5-2021
    print(format(time(19, 22, 15)))
    # 19:22:15
  • What if you want to switch on the type of multiple parameters? multipledispatch, a third party package, does the trick:
    from multipledispatch import dispatch

    @dispatch(list, str)
    def concatenate(a, b):
        a.append(b)
        return a

    @dispatch(str, str)
    def concatenate(a, b):
        return a + b

    print(concatenate(["a", "b"], "c"))
    # ['a', 'b', 'c']
    print(concatenate("Hello", "World"))
    # HelloWorld

Mike #6: Aiosql

  • Fast Async SQL Template Engine
  • Lightweight replacement for ORM libraries such as SQLAlchemy.

Extras

Michael

  • SoftwareX Journal, Elsevier has had an open-access software journal, via Daniel Mulkey. There's even a special issue collection on software contributing to gravitational wave discovery.
  • Python 3.10.0b2 is available
  • Django security releases issued: 3.2.4, 3.1.12, and 2.2.24
  • Talks on YouTube for PyCon 2021.
  • aicsimageio 4.0 released, lots of goodness for bio-image analysis and microscopy, thanks Madison Swain-Bowden.

Mike

Joke

Bank robbers

More episodes
Search
Clear search
Close search
Google apps
Main menu