[HN Gopher] Using Mypy in Production ___________________________________________________________________ Using Mypy in Production Author : charliermarsh Score : 23 points Date : 2022-08-22 20:31 UTC (2 hours ago) (HTM) web link (notes.crmarsh.com) (TXT) w3m dump (notes.crmarsh.com) | kungfufrog wrote: | I can't articulate specifically why but using typing in Python | just feels like so much pain compared to other languages that | have "opt-in" nominal typing syntax (PHP et al.). | | The workflow feels frustrating, the ecosystem seems diverse and | has no clear "blessed" path, and I'm still confused about what is | bundled by Python and what I need to pull in from an external | source. I REALLY want to use mypy but by the time I've figured | out how to pull it all together I probably could have finished | the program I'm working on. | | The relevant factor here might be the size of Python programs I | typically work on, somewhere between a few hundred lines and a | few thousand. | | I'm glad other people are having success because hopefully | that'll smooth the pavement for the next time I circle around and | try to add some meaningful types to my Python programs. | codekansas wrote: | As someone who owns multiple label makers and organizes my | utensils by type when I put them into the dishwasher I really | like Mypy. Cool writeup, good points. I think a lot of people (ML | scientist people especially) who haven't been forced to use a | type checker don't realize the productivity benefits of having a | type checker running on your whole codebase - they only see the | annoying slow-down of having to do things a particular way and | having the type checker bug you for inconspicuous errors. | | Example: One pattern (which I don't think a lot of people are | familiar with?) that I started adopting recently is the use of | `Literal` for type-checking strings. For example, instead of | something like | | (on closer reading I realized this was in the blog post as well, | but I suspect maybe some ML people will have seen this specific | case before) class ActivationType(enum.Enum): | sigmoid = "sigmoid" tanh = "tanh" def | get_activation(key: str | ActivationType) -> nn.Module: | key = ActivationType[key] if key == | ActivationType.sigmoid: return nn.Sigmoid() if | key == ActivationType.tanh: return nn.Tanh() | raise KeyError(key) | | you can do something like this instead: from | typing import Literal ActivationType = | Literal["sigmoid", "tanh"] def get_activation(key: | ActivationType) -> nn.Module: if key == "sigmoid": | return nn.Sigmoid() if key == "tanh": return | nn.Tanh() raise KeyError(key) | | The advantage is that you can do something like | act = get_activation("tahn") | | and Mypy will show an error for your typo (instead of having to | run your code and eventually hit the `KeyError`). So if you're | just trying to quickly implement an idea, you don't have to kill | brain cells searching for typos. | | Of course, doesn't make a difference if your coworkers all use | Vim and Emacs with no extensions... ___________________________________________________________________ (page generated 2022-08-22 23:00 UTC)