Coder Social home page Coder Social logo

luttik / auto-optional Goto Github PK

View Code? Open in Web Editor NEW
16.0 2.0 3.0 599 KB

Makes typed arguments Optional when the default argument is None

Home Page: https://auto-optional.daanluttik.nl/

License: MIT License

Python 100.00%
python refactoring code-quality pypi python3

auto-optional's Introduction

auto-optional

Logo

auto-optional: adds the Optional type-hint to arguments where the default value is None

actions batch pypi python versions codecov License: MIT Code style: black


Documentation: auto-optional.daanluttik.nl

Source Code: 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:

def foo(bar: str = None):
    ...

Would turn into

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

In the media:

auto-optional was covered on PythonBytes #251

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. Add the following text to your repositories .pre-commit-config.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]
  • There is no ignore (for code lines) option yet [#3]
  • Code is aways read and written as UTF-8 (which is accurate most of the time). [#4]
  • There is no diff or check command yet for a dry-run or linting. [#5]

auto-optional's People

Contributors

browniebroke avatar danygielow avatar dependabot[bot] avatar dmytrolitvinov avatar jaap3 avatar luttik avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

auto-optional's Issues

Add an exclude option.

Add an exclude option

Consider:

  • Using glob-patterns
  • Looking at other formatters and linters for the best patterns

Leave a ๐Ÿ‘ if you want this

Error: Got unexpected extra arguments (list of files)

Hi @Luttik ,

I am trying to use it in an existing project and I am adding next config to my .pre-commit-config.yaml file.
The idea that I want to specify path to command so it checks src/ folder only
Here is an overview structure of project:

...
โ”œโ”€โ”€ requirements-dev.in
โ”œโ”€โ”€ requirements-dev.txt
โ”œโ”€โ”€ requirements.in
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ src
โ”œโ”€โ”€ static
โ”œโ”€โ”€ templates
โ”œโ”€โ”€ tmp
...

This is config for auto-optional which I integrate into .pre-commit-config.yaml file

          ......
        - id: auto-optional
          name: auto-optional
          description: Adds the Optional type-hint to arguments where the default value is None
          entry: auto-optional src/
          language: python
          types: [python]
          ....

And I am getting next errors:

Error: Got unexpected extra arguments (src/asgi.py src/accounts/models/bill_blacklist_models.py src/hooks/models.py .... (continue list of files which should be proceeded)


How do I resolve it:

Added pass_filenames: false so in the end the config should be:

        - id: auto-optional
          name: auto-optional
          description: Adds the Optional type-hint to arguments where the default value is None
          entry: auto-optional src/
          language: python
          types: [python]
          pass_filenames: false

It takes longer time on the whole for verifying but this is a temp solution for that.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.