Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Luttik/auto-optional
Makes typed arguments Optional when the default argument is None
https://github.com/Luttik/auto-optional
code-quality pypi python python3 refactoring
Last synced: about 1 month ago
JSON representation
Makes typed arguments Optional when the default argument is None
- Host: GitHub
- URL: https://github.com/Luttik/auto-optional
- Owner: Luttik
- License: mit
- Created: 2021-08-30T15:09:10.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-12-09T13:53:18.000Z (about 2 years ago)
- Last Synced: 2024-11-10T05:41:57.834Z (about 2 months ago)
- Topics: code-quality, pypi, python, python3, refactoring
- Language: Python
- Homepage: https://auto-optional.daanluttik.nl/
- Size: 585 KB
- Stars: 17
- Watchers: 2
- Forks: 3
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-python-typing - auto-optional - Makes typed arguments Optional when the default argument is `None`. (Tools / Helper tools to add annotations to existing code)
README
# auto-optional
auto-optional: adds the Optional type-hint to arguments where the default value is None---
**Documentation**: [auto-optional.daanluttik.nl](https://auto-optional.daanluttik.nl)
**Source Code**: [github.com/luttik/auto-optional](https://github.com/Luttik/auto-optional)
---
## What does auto-optional do
The basic purpose of auto-optional is ensuring that whenever a default argument is `None` the type annotation is Optional.For example:
```py
def foo(bar: str = None):
...
```Would turn into
```py
from typing import Optional
def foo(bar: Optional[str] = None):
...
```## Why would you want this
- Easily modify external libraries that didn't pay attention
to proper use of optional to improve mypy lintingf.
- Force consistency in your own code-base:
Enforcing that `None` parameter implies an `Optional` type.
- Explicit is better than implicit — [pep 20](https://www.python.org/dev/peps/pep-0020/)## In the media:
auto-optional was covered on
[PythonBytes #251](https://pythonbytes.fm/episodes/show/251/a-95-complete-episode-wait-for-it)> I love these little tools that you can run against your code that will just reformat them to be better.
>
> — Michael Kennedy## Install
Install with `pip install auto-optional`.## Run
After installing you can run auto-optional using `auto-optional [paths...]`
(if no path is provided it'll process the current working directory).## pre-commit
You can run auto-optional via [pre-commit](https://pre-commit.com/).
Add the following text to your repositories `.pre-commit-config.yaml`:```yaml
repos:
- repo: https://github.com/luttik/auto-optional
rev: v0.3.1 # The version of auto-optional to use
hooks:
- id: auto-optional
```## Things of note
### Things that are handled well
- The alternatives to `Optional` are supported, that means both;
- `Union[X, None]`
- `x | None` (allowed since python 3.10+).
- Existing imports are reused.
- `import as` and `from typing import ...` statements are properly handled.### Things that need improvement
For all these points you can leave a thumbs-up if you want it. Also, I welcome pull-requests for these issues.- There is no exclude (for file patterns) option yet [[#2]](https://github.com/Luttik/auto-optional/issues/2)
- There is no ignore (for code lines) option yet [[#3]](https://github.com/Luttik/auto-optional/issues/3)
- Code is aways read and written as `UTF-8` (which is accurate most of the time). [[#4]](https://github.com/Luttik/auto-optional/issues/4)
- There is no `diff` or `check` command yet for a dry-run or linting. [[#5]](https://github.com/Luttik/auto-optional/issues/5)