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

Episode #291: Wait, you have how many licenses?!?

Published Wed, Jul 6, 2022, recorded Wed, Jul 6, 2022.


Watch the live stream:


About the show

Sponsored by us! Support our work through:

Michael #1: Python License tracker

  • by Tom Nijhof/Nyhof
  • Every package depends on other package with sometimes different licenses.
  • Tom made a tool to find out what licenses you all need for a project:
  • PyTest alone needs 4 different licenses for itself and its dependencies.
  • Tensorflow is even worst

Brian #2: undataclass

  • Trey Hunner
  • As a teaching aid, and to show how much dataclasses do for you, this is a module and an application that converts dataclasses to normal classes, and fills in all of the dunder methods you need.
  • Example in app:

    from dataclasses import dataclass
    
        @dataclass()
        class Point:
            x: float
            y: float
            z: float
    
  • Converts to

    class Point:
            __match_args__ = ('x', 'y', 'z')
    
            def __init__(self, x: float, y: float, z: float) -> None:
                self.x = x
                self.y = y
                self.z = z
    
            def __repr__(self):
                cls = type(self).__name__
                return f'{cls}(x={self.x!r}, y={self.y!r}, z={self.z!r})'
    
            def __eq__(self, other):
                if not isinstance(other, Point):
                    return NotImplemented
                return (self.x, self.y, self.z) == (other.x, other.y, other.z)
    
  • Note on NotImplemented:

    • It just means, “I don’t know how to compare this”, and Python will try __eq__ on the other object. If that also raises NotImplemented, a False is returned.
  • The default is the above with @dataclass(frozen=True, slots=True) and adds the methods:
    • fronzen=True gives you implementations of __hash__, __setattr__, __delattr__, __getstate__, __setstate__,
      • Essentially raises exception if you try to change the contents, and makes your objects hashable.
    • slots=True adds the line: __slots__ = (``'``x', '``y``'``, '``z``'``).
      • This disallows adding new attributes to objects at runtime. See Python docs
  • Trey wrote two posts about it:
  • Turns out, this is a cool example for AST and structural pattern matching.
  • Notes from the “how I made..” article:
  • "I used some tricks I don't usually get to use in Python. I used:
  • Many very hairy **match**-**case** blocks which replaced even hairier if-elif blocks
  • A sentinel object to keep track of a location that needed replacing
  • Python's **textwrap.dedent** utility, which I feel should be more widely known & used
  • slice assignment to inject one list into another
  • The ast module's unparse function to convert an abstract syntax tree into Python code”

Michael #3: Qutebrowser

  • via Martin Borus
  • Qutebrowser is a keyboard-focused browser with a minimal GUI."
  • It's Python powered
  • Whats more important - doesn't force you to use it's Vim-based shortcuts, the mouse
  • still works. But you usually don't need it: Because on any page, a keypress on the "f" key will show, you every clickable think and a letter combination to enter to click this.

Brian #4: asyncio and web applications

  • A collection of articles
  • Quart is now a Pallets project
    • P G Jones, maintainer of Quart and Hypercorn
    • “Quart, an ASGI re-implementation of the Flask API has joined the Pallets organization. This means that future development will be under the Pallets governance by the Pallets maintainers.
    • Our long term aim is to merge Quart and Flask to bring ASGI support directly to Flask.
    • “When to use Quart?”
      • “Quart is an ASGI framework utilising async IO throughout, whereas Flask is a WSGI framework utilising sync IO. It is therefore best to use Quart if you intend to use async IO (i.e. async/await libraries) and Flask if not. Don't worry if you choose the 'wrong' framework though, as Quart supports sync IO and Flask supports async IO, although less efficiently.”
  • Using async and await, from Flask docs
    • Flask has some support of async/await since Flask 2.0
    • But it’s still a WSGI application.
    • “Deciding whether you should use Flask, Quart, or something else is ultimately up to understanding the specific needs of your project.”
  • Should You Use AsyncIO for Your Next Python Web Application?
    • Steven Pate
    • A cool “brief history of Python web server interfaces”
    • Discussion of the Python servers and frameworks for both WSGI and ASGI
    • Recommendation: Do you need async? “… most people don’t. WSGI servers and frameworks are usually performant enough.”

Extras

Michael:

Joke: Understanding JavaScript

Joke: Where do you see yourself in 5 years?


Want to go deeper? Check our projects