#303: This title is required or is it optional?
Published Thu, Sep 29, 2022, recorded Wed, Sep 28, 2022
About the show
Sponsored by Microsoft for Startups Founders Hub.
Michael #1: Human regular expressions revisited
- via Mikael Honkala
- We mentioned of Al Sweigart's humre in Python Bytes…
- Mikael went on a little search and compiled my findings into this repo.
- A lot of people feel that re needs some help. At least 3 of the "serious" packages I found came out in the last few months.
- Since a package like this is not overly complex to make, all the ways to approach the problem are clearly being explored.
- Unfortunately these seem to be mostly single-person efforts, and many have fallen to the wayside before long.
- Hopefully there's some consolidation on the horizon, to share some of the maintenance effort and establish some of the packages as here for the long haul.
- The list could be useful to you if you are:
- Looking for a tool: Check the list to get a quick idea of the "look and feel" of each package.
- Thinking about building a tool: Check the list for alternative approaches, and maybe consider if contributing to an existing package might be a better way to get what you need.
- Building a tool, or already have one: Use the list to clarify and communicate what the main differences and strengths of your solution are.
- … in a future mypy feature release (possibly the next one after 0.98x) …
- Thanks Adam Johnson for spotting this and letting us know
- Stop doing this:
s: str = None
- Do one of these:
s: str | None = None
s: Union[str, None] = None
s: Optional[str] = None← but this has problems
- Optional != optional
- From python docs:
Optional[X]is equivalent to
X | None(or
- “Note that this is not the same concept as an optional argument, which is one that has a default. An optional argument with a default does not require the
Optionalqualifier on its type annotation just because it is optional. “
- From python docs:
- Best described in FastAPI docs, Python Types Intro, starting at “Possibly None"
- Recommendation is to use:
s: str | None = Nonefor Python 3.10+
s: Union[str, None] = Nonefor Python 3.9+
- For 3.7, 3.8, you still have
Optionalas an option, I think.
- Why haven’t you upgraded to 3.9? We’re almost to 3.11, what’s the problem?!
Michael #3: cython-lint
- by Marco Gorelli
- A tool (and pre-commit hook) to lint Cython files, similar to how flake8 lints Python files, and works by parsing Cython's own AST (abstract syntax tree).
- Found quite a few nice clean-ups which could be applied on:
Brian #4: difftastic - structural diff
- “Difftastic is a structural diff tool that understands syntax.”
- “Difftastic detects the language, parses the code, and then compares the syntax trees.”
- Interesting story about building difftastic
- For one off
GIT_EXTERNAL_DIFF=difft git diff
GIT_EXTERNAL_DIFF="difft --syntax-highlight=off" git diff
- To always use
difftwith git, see https://difftastic.wilfred.me.uk/git.html
Joke: I mean, who’s wrong?