A plugin for Flake8 that checks pandas code

Overview

pandas-vet

tests codecov Code style: black PyPI - License

PyPI PyPI - Status PyPI - Downloads

Conda Version Conda Downloads

pandas-vet is a plugin for flake8 that provides opinionated linting for pandas code.

It began as a project during the PyCascades 2019 sprints.

Motivation

Starting with pandas can be daunting. The usual internet help sites are littered with different ways to do the same thing and some features that the pandas docs themselves discourage live on in the API. pandas-vet is (hopefully) a way to help make pandas a little more friendly for newcomers by taking some opinionated stances about pandas best practices. It is designed to help users reduce the pandas universe.

The idea to create a linter was sparked by Ania Kapuścińska's talk at PyCascades 2019, "Lint your code responsibly!".

Many of the opinions stem from Ted Petrou's excellent Minimally Sufficient Pandas. Other ideas are drawn from pandas docs or elsewhere. The Pandas in Black and White flashcards have a lot of the same opinions too.

Installation

pandas-vet is a plugin for flake8. If you don't have flake8 already, it will install automatically when you install pandas-vet.

The plugin is on PyPI and can be installed with:

pip install pandas-vet

It can also be installed with conda:

conda install -c conda-forge pandas-vet

pandas-vet is tested under Python 3.6, 3.7, 3.8, and 3.9 as defined in our GitHub Actions

Usage

Once installed successfully in an environment that also has flake8 installed, pandas-vet should run whenever flake8 is run.

$ flake8 ...

See the flake8 docs for more information.

For a full list of implemented warnings, see the list below.

Contributing

pandas-vet is still in the very early stages. Contributions are welcome from the community on code, tests, docs, and just about anything else.

Code of Conduct

Because this project started during the PyCascades 2019 sprints, we adopt the PyCascades minimal expectation that we "Be excellent to each another". Beyond that, we follow the Python Software Foundation's Community Code of Conduct.

Steps to contributing

  1. Please submit an issue (or draft PR) first describing the types of changes you'd like to implement.

  2. Fork the repo and create a new branch for your enhancement/fix.

  3. Get a development environment set up with your favorite environment manager (conda, virtualenv, etc.).

    1. You must use at least python 3.6 to develop, for black support.

    2. You can create one from pip install -r requirements_dev.txt or, if you use Docker, you can build an image from the Dockerfile included in this repo.

    3. Once your enviroment is set up you will need to install pandas-vet in development mode. Use pip install -e . (use this if you are alreay in your virtual enviroment) or pip install -e <path> (use this one if not in the virtual enviroment and prefer to state explicitly where it is going).

  4. Write code, docs, etc.

  5. We use pytest, flake8, and black to validate our codebase. TravisCI integration will complain on pull requests if there are any failing tests or lint violations. To check these locally, run the following commands:

pytest --cov="pandas_vet"
flake8 pandas_vet setup.py tests --exclude tests/data
black --check pandas_vet setup.py tests --exclude tests/data
  1. Push to your forked repo.

  2. Submit pull request to the parent repo from your branch. Be sure to write a clear message and reference the Issue # that relates to your pull request.

  3. Feel good about giving back to open source projects.

How to add a check to the linter

  1. Write tests. At a minimum, you should have test cases where the linter should catch "bad" pandas and test cases where the linter should allow "good" pandas.

  2. Write your check function in /pandas-vet/__init__.py.

  3. Run flake8 and pytest on the linter itself (see Steps to contributing)

Contributors

PyCascades 2019 sprints team

PyCascades 2020 sprints team

Other awesome contributors

  • Earl Clark
  • Leandro Leites

List of warnings

PD001: pandas should always be imported as 'import pandas as pd'

PD002: 'inplace = True' should be avoided; it has inconsistent behavior

PD003: '.isna' is preferred to '.isnull'; functionality is equivalent

PD004: '.notna' is preferred to '.notnull'; functionality is equivalent

PD005: Use arithmetic operator instead of method

PD006: Use comparison operator instead of method

PD007: '.ix' is deprecated; use more explicit '.loc' or '.iloc'

PD008: Use '.loc' instead of '.at'. If speed is important, use numpy.

PD009: Use '.iloc' instead of '.iat'. If speed is important, use numpy.

PD010 '.pivot_table' is preferred to '.pivot' or '.unstack'; provides same functionality

PD011 Use '.array' or '.to_array()' instead of '.values'; 'values' is ambiguous

PDO12 '.read_csv' is preferred to '.read_table'; provides same functionality

PD013 '.melt' is preferred to '.stack'; provides same functionality

PD015 Use '.merge' method instead of 'pd.merge' function. They have equivalent functionality.

Very Opinionated Warnings

These warnings are turned off by default. To enable them, add the -annoy flag to your command, e.g.,

$ flake8 --annoy my_file.py

PD901 'df' is a bad variable name. Be kinder to your future self.

Comments
  • PD007, PD008, PD009 should not use node.value.attr

    PD007, PD008, PD009 should not use node.value.attr

    When flake8 runs check_for_ix, check_for_at, or check_for_iat, it raises AttributeError: 'Name' object has no attribute 'attr'

    This seems to indicate that node.value returns a 'Name' object and that node.value.attr should be changed. Not sure if we can follow the pattern for check_for_isnull, etc. because it .ix[], .at[].

    bug 
    opened by deppen8 6
  • Conda and pip install (0.2.2) not showing plugins with flake8 --version; 0.2.1 works

    Conda and pip install (0.2.2) not showing plugins with flake8 --version; 0.2.1 works

    Installing pandas-vet with pip or conda on Windows or WSL results in flake8 --version returning

    3.7.9 () CPython 3.7.3 on Windows
    3.7.9 () CPython 3.8.2 on Linux
    

    Expected behavior

    1. Make a new env
    2. pip install flake8 pandas-vet==0.2.2
    flake8 --version
    3.7.9 (flake8-pandas-vet: 0.2.1, mccabe: 0.6.1, pycodestyle: 2.5.0, pyflakes: 2.1.1) CPython 3.7.3 on Windows
    

    To Reproduce Steps to reproduce the behavior:

    1. Make a new env
    2. pip install flake8 pandas-vet or pip install flake8 pandas-vet==0.2.2
    3. flake8 --version
    4. See error

    Desktop Environment:

    • OS: Microsoft Windows [Version 10.0.18363.720]
    • Python versions tested: 3.7.3, 3.8.2
    • pandas-vet version: 0.2.2

    Additional Context Running flake8 -v --version results in:

    flake8.plugins.manager    MainProcess     65 INFO     Loading entry-points for "flake8.extension".
    flake8.plugins.manager    MainProcess     73 INFO     Loading entry-points for "flake8.report".
    flake8.plugins.manager    MainProcess     80 INFO     Loading plugin "F" from entry-point.
    flake8.plugins.manager    MainProcess    118 INFO     Loading plugin "pycodestyle.ambiguous_identifier" from entry-point
    .
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.bare_except" from entry-point.
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.blank_lines" from entry-point.
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.break_after_binary_operator" from entr
    y-point.
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.break_before_binary_operator" from ent
    ry-point.
    flake8.plugins.manager    MainProcess    123 INFO     Loading plugin "pycodestyle.comparison_negative" from entry-point.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.comparison_to_singleton" from entry-po
    int.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.comparison_type" from entry-point.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.compound_statements" from entry-point.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.continued_indentation" from entry-poin
    t.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.explicit_line_join" from entry-point.
    flake8.plugins.manager    MainProcess    124 INFO     Loading plugin "pycodestyle.extraneous_whitespace" from entry-poin
    t.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.imports_on_separate_lines" from entry-
    point.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.indentation" from entry-point.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.maximum_doc_length" from entry-point.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.maximum_line_length" from entry-point.
    flake8.plugins.manager    MainProcess    125 INFO     Loading plugin "pycodestyle.missing_whitespace" from entry-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.missing_whitespace_after_import_keywor
    d" from entry-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.missing_whitespace_around_operator" fr
    om entry-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.module_imports_on_top_of_file" from en
    try-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.python_3000_async_await_keywords" from
     entry-point.
    flake8.plugins.manager    MainProcess    126 INFO     Loading plugin "pycodestyle.python_3000_backticks" from entry-poin
    t.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.python_3000_has_key" from entry-point.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.python_3000_invalid_escape_sequence" f
    rom entry-point.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.python_3000_not_equal" from entry-poin
    t.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.python_3000_raise_comma" from entry-po
    int.
    flake8.plugins.manager    MainProcess    127 INFO     Loading plugin "pycodestyle.tabs_obsolete" from entry-point.
    flake8.plugins.manager    MainProcess    128 INFO     Loading plugin "pycodestyle.tabs_or_spaces" from entry-point.
    flake8.plugins.manager    MainProcess    128 INFO     Loading plugin "pycodestyle.trailing_blank_lines" from entry-point
    .
    flake8.plugins.manager    MainProcess    128 INFO     Loading plugin "pycodestyle.trailing_whitespace" from entry-point.
    flake8.plugins.manager    MainProcess    128 INFO     Loading plugin "pycodestyle.whitespace_around_comma" from entry-po
    int.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_around_keywords" from entry
    -point.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_around_named_parameter_equa
    ls" from entry-point.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_around_operator" from entry
    -point.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_before_comment" from entry-
    point.
    flake8.plugins.manager    MainProcess    129 INFO     Loading plugin "pycodestyle.whitespace_before_parameters" from ent
    ry-point.
    flake8.plugins.manager    MainProcess    130 INFO     Loading plugin "C90" from entry-point.
    flake8.plugins.manager    MainProcess    131 INFO     Loading plugin "PD" from entry-point.
    flake8.plugins.manager    MainProcess    147 INFO     Loading plugin "default" from entry-point.
    flake8.plugins.manager    MainProcess    151 INFO     Loading plugin "pylint" from entry-point.
    flake8.plugins.manager    MainProcess    151 INFO     Loading plugin "quiet-filename" from entry-point.
    flake8.plugins.manager    MainProcess    151 INFO     Loading plugin "quiet-nothing" from entry-point.
    
    opened by jeffchiou 4
  • Create pull-request template

    Create pull-request template

    In order to facilitate the maintenance of the change log, it will be good if we ask PRs to be structured like updates to the change log. This is part of my ongoing effort to make project management and community contributions as straightforward as possible.

    docs 
    opened by deppen8 4
  • Write AST explorer tool to facilitate creation of new 'check' functions.

    Write AST explorer tool to facilitate creation of new 'check' functions.

    Developing the check functions for each linter errors requires exploration of the AST nodes to determine the corresponding attributes to be compared against the valid code patterns. This presents a barrier to quickly implementing new linter checks that could be reduced if there were a tool that returns the appropriate AST node attributes for a specified pattern.

    The envisioned solution might utilize the following form:

    attributes = ast_explore(code_signature)
    

    where code_signature is a string representing the code pattern of interest, and attributes is a string (or list of strings) representing the composed attributes for the corresponding AST node. This string could then be appended to the AST node in the check functions:

    if node.<attribute_string> == <test_condition>:
    

    or

    for attribute in node.<attribute_string>:
    
    enhancement 
    opened by simchuck 4
  • Check for pd.merge

    Check for pd.merge

    Check for use of pd.merge function. Preferred is .merge method. Even pandas docs use .merge for the documentation of pd.merge! See flashcard.

    Give error message:

    Use '.merge' method instead of 'pd.merge' function. They have equivalent functionality.

    new check 
    opened by deppen8 4
  • fix(PD011): avoid false positives for dict.values()

    fix(PD011): avoid false positives for dict.values()

    fixes https://github.com/deppen8/pandas-vet/issues/106

    The implementation consists of two steps:

    1. We have to keep a reference of the Call node before visiting children
    2. When visiting an Attribute, add some checks to make sure we raise only if we did not come from a .values() (Call)
    opened by pwoolvett 3
  • Challenging PD008: .at can be useful

    Challenging PD008: .at can be useful

    Is there a good reason to prefer .loc over .at when you need to get a single value?

    We use .at over .loc in our codebase when we want to signal to other developers that we intend to get a single value, as opposed to a Series or DataFrame.

    The warning seems to assume the developer picked .at for speed, while their intention is more likely to have picked it for correctness and clarity.

    opened by lsorber 3
  • Edit wiki with info for exploring the AST.

    Edit wiki with info for exploring the AST.

    There doesn't seem to be any way to contribute to the wiki, but I thought it would be useful to include my comments from Issue #33 for exploring the AST during development.

    I don't know how the page references and linking work within the markdown documents. I created a separate markdown file, and tried to link to this from the wiki home page.

    opened by simchuck 3
  • fix check_for_ix, check_for_at, check_for_iat checks

    fix check_for_ix, check_for_at, check_for_iat checks

    These functions now check the type of node.value. node.value can be either a Name or Attribute, which do not have matching attributes. Before you can check whether it matches the desired pattern (i.e., ix, at, iat), you need to figure out if you are working with a Name or Attribute.

    If node.value is ast.Name, use node.value.id.

    If node.value is ast.Attribute, use node.value.attr.

    Closes #44

    opened by deppen8 3
  • Implement check for use of arithmetic and comparison methods.

    Implement check for use of arithmetic and comparison methods.

    Preferred use of binary operators is recommended.

    I used loops in both the check and test functions to minimize repetition of the code, so there are not individual test results for each operator or method.

    I expect some trivial merge conflicts compared to the 'array' pull request, since code in this PR does not include the added docstrings from that previous PR.

    Closes #6

    opened by simchuck 3
  • Check for .pivot and .unstack

    Check for .pivot and .unstack

    Check for .pivot and .unstack methods. See flashcard. Give error message:

    '.pivot' and '.unstack' functionality can be achieved with just '.pivot_table'

    new check 
    opened by deppen8 3
  • Improve contributor experience

    Improve contributor experience

    Is your feature request related to a problem? Please describe. I really like this project, and I want to contribute, but there are some roadblocks in the way. Getting the project setup on my local machine had some issues:

    • Python 3.10 not supported. That is my default python, so it would be helpful if it was supported
    • Outdated dependencies. pytest and black are both pinned to old version that have issues. I suggest moving to poetry for dependecy handling instead
    • manual style checks. I'd much rather have a predefined pre-commit check to run black, flake8, pytest etc, instead of finding the exact commands in the readme before committing.

    This is not meant to be one big complaint. This project is really useful to me, so thanks for building it.

    opened by KPLauritzen 0
  • Change recommendation from .array/.to_array() to .to_numpy()

    Change recommendation from .array/.to_array() to .to_numpy()

    Please complete this template for all pull requests to pandas-vet. It will help us to review the PR faster. Also, this format is based on Keep a Changelog and will help keep the change log accurate and up-to-date.

    Related issues

    • #113

    This PR does the following:

    Added

    • None

    Changed

    • Change PD011 recommendation from .array and .to_array() to .to_numpy()

    Deprecated

    • None

    Removed

    • None

    Fixed

    • None

    Security

    • None

    Closes #113

    opened by KPLauritzen 0
  • PD011 - shoud be to_numpy() instead of to_array()?

    PD011 - shoud be to_numpy() instead of to_array()?

    Describe the bug for PD011 should the suggestion instead be to_numpy() instead of to_array() (given suggestion in warnings of https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.values.html)? Perhaps I am wrong on this but just wanted to bring up or least get clarification on potential difference

    opened by ksdaftari 0
  • inplace set to a variable raises exception

    inplace set to a variable raises exception

    Describe the bug raised exception

    To Reproduce Steps to reproduce the behavior:

    Have the following code in a file

    def some_function(dataFrame, in_place=False):
        return dataFrame.drop([], inplace=in_place)
    

    Expected behavior Allow flake8 to report violations and not throw exceptions.

    Screenshots Screen Shot 2021-09-11 at 11 42 54 AM

    Additional context

    bash-5.1# cat /usr/lib/python3.9/site-packages/pandas_vet/version.py 
    __version__ = "0.2.2"
    

    This is running on a docker container based on alpine:3.14.1. Same results obtained on a mac.

    Things work if we do not provide a variable:

    def some_function(dataFrame, in_place=False):
        return dataFrame.drop([], inplace=False)
    
    opened by manuel-lopez-lyb 0
  • New approach to docs with JupyterBook

    New approach to docs with JupyterBook

    I have recently started adopting JupyterBook for documenting projects and I love it. It is great for adding the things that I would like to add to pandas-vet like tutorials and mixing Markdown and reST Sphinx docs.

    It also has nice pre-defined GitHub Actions for building the docs and putting them in a branch for GitHub Pages.

    This would replace issue #70 and #87

    enhancement good first issue docs ci/cd 
    opened by deppen8 0
Releases(v0.2.3)
  • v0.2.3(Feb 9, 2022)

  • v0.2.1(Jul 29, 2019)

    This version contains a few small fixes. Most notably, it fixes a bug with the PD015 check.

    How to get it?

    From PyPI:

    pip install pandas-vet
    

    From conda-forge:

    conda install -c conda-forge pandas-vet
    

    [0.2.1] - 2019-07-27

    Added

    • Leandro Leites added as contributor (#66)

    Removed

    • Unnecessary commented line from setup.py (#67)

    Fixed

    • PD015 would fail if node.func.value did not have an id. Fixed with #65
    • version.py now correctly uses v0.2.x. This version file was not bumped with the last release. (#67)
    Source code(tar.gz)
    Source code(zip)
    pandas-vet-0.2.1.tar.gz(6.27 KB)
    pandas_vet-0.2.1-py3-none-any.whl(7.42 KB)
  • v0.2.0(Apr 2, 2019)

    How to get it?

    Available on PyPI at https://pypi.org/project/pandas-vet/0.2.0/

    pip install pandas-vet
    

    New warnings in v0.2.0

    PD010 '.pivot_table' is preferred to '.pivot' or '.unstack'; provides same functionality

    PD011 Use '.array' or '.to_array()' instead of '.values'; 'values' is ambiguous

    PDO12 '.read_csv' is preferred to '.read_table'; provides same functionality

    PD013 '.melt' is preferred to '.stack'; provides same functionality

    PD015 Use '.merge' method instead of 'pd.merge' function. They have equivalent functionality.

    Full list of implemented warnings

    PD001: pandas should always be imported as 'import pandas as pd'

    PD002: 'inplace = True' should be avoided; it has inconsistent behavior

    PD003: '.isna' is preferred to '.isnull'; functionality is equivalent

    PD004: '.notna' is preferred to '.notnull'; functionality is equivalent

    PD005: Use arithmetic operator instead of method

    PD006: Use comparison operator instead of method

    PD007: '.ix' is deprecated; use more explicit '.loc' or '.iloc'

    PD008: Use '.loc' instead of '.at'. If speed is important, use numpy.

    PD009: Use '.iloc' instead of '.iat'. If speed is important, use numpy.

    PD010 '.pivot_table' is preferred to '.pivot' or '.unstack'; provides same functionality

    PD011 Use '.array' or '.to_array()' instead of '.values'; 'values' is ambiguous

    PDO12 '.read_csv' is preferred to '.read_table'; provides same functionality

    PD013 '.melt' is preferred to '.stack'; provides same functionality

    PD015 Use '.merge' method instead of 'pd.merge' function. They have equivalent functionality.

    Source code(tar.gz)
    Source code(zip)
    pandas-vet-0.2.0.tar.gz(5.92 KB)
    pandas_vet-0.2.0-py3-none-any.whl(7.06 KB)
  • v0.1.0(Feb 27, 2019)

    How to get it?

    Available on PyPI at https://pypi.org/project/pandas-vet/0.1.0/

    List of implemented warnings

    PD001: pandas should always be imported as 'import pandas as pd'

    PD002: 'inplace = True' should be avoided; it has inconsistent behavior

    PD003: '.isna' is preferred to '.isnull'; functionality is equivalent

    PD004: '.notna' is preferred to '.notnull'; functionality is equivalent

    PD005: Use arithmetic operator instead of method

    PD006: Use comparison operator instead of method

    PD007: '.ix' is deprecated; use more explicit '.loc' or '.iloc'

    PD008: Use '.loc' instead of '.at'. If speed is important, use numpy.

    PD009: Use '.iloc' instead of '.iat'. If speed is important, use numpy.

    Source code(tar.gz)
    Source code(zip)
Owner
Jacob Deppen
Archaeologist, Data Scientist, Sports fan
Jacob Deppen
Mylint - My really simple rendition of how a linter works.

mylint My really simple rendition of how a linter works. This original version was written for my AST article. Since then I've added tests and turned

Tushar Sadhwani 2 Dec 29, 2021
A Pylint plugin to analyze Flask applications.

pylint-flask About pylint-flask is Pylint plugin for improving code analysis when editing code using Flask. Inspired by pylint-django. Problems pylint

Joe Schafer 62 Sep 18, 2022
Static type checker for Python

Static type checker for Python Speed Pyright is a fast type checker meant for large Python source bases. It can run in a “watch” mode and performs fas

Microsoft 9.2k Jan 03, 2023
Performant type-checking for python.

Pyre is a performant type checker for Python compliant with PEP 484. Pyre can analyze codebases with millions of lines of code incrementally – providi

Facebook 6.2k Jan 04, 2023
Flake8 wrapper to make it nice, legacy-friendly, configurable.

THE PROJECT IS ARCHIVED Forks: https://github.com/orsinium/forks It's a Flake8 wrapper to make it cool. Lint md, rst, ipynb, and more. Shareable and r

Life4 232 Dec 16, 2022
MyPy types for WSGI applications

WSGI Types for Python This is an attempt to bring some type safety to WSGI applications using Python's new typing features (TypedDicts, Protocols). It

Blake Williams 2 Aug 18, 2021
Flake8 plugin that checks import order against various Python Style Guides

flake8-import-order A flake8 and Pylama plugin that checks the ordering of your imports. It does not check anything else about the imports. Merely tha

Python Code Quality Authority 270 Nov 24, 2022
🦆 Better duck-typing with mypy-compatible extensions to Protocol

🦆 Quacks If it walks like a duck and it quacks like a duck, then it must be a duck Thanks to PEP544, Python now has protocols: a way to define duck t

Arie Bovenberg 9 Nov 14, 2022
The strictest and most opinionated python linter ever!

wemake-python-styleguide Welcome to the strictest and most opinionated python linter ever. wemake-python-styleguide is actually a flake8 plugin with s

wemake.services 2.1k Jan 01, 2023
Code audit tool for python.

Pylama Code audit tool for Python and JavaScript. Pylama wraps these tools: pycodestyle (formerly pep8) © 2012-2013, Florent Xicluna; pydocstyle (form

Kirill Klenov 967 Jan 07, 2023
Enforce the same configuration across multiple projects

Nitpick Flake8 plugin to enforce the same tool configuration (flake8, isort, mypy, Pylint...) across multiple Python projects. Useful if you maintain

Augusto W. Andreoli 315 Dec 25, 2022
flake8 plugin which checks that typing imports are properly guarded

flake8-typing-imports flake8 plugin which checks that typing imports are properly guarded installation pip install flake8-typing-imports flake8 codes

Anthony Sottile 50 Nov 01, 2022
Flake8 extension to provide force-check option

flake8-force Flake8 extension to provide force-check option. When this option is enabled, flake8 performs all checks even if the target file cannot be

Kenichi Maehashi 9 Oct 29, 2022
Tool to automatically fix some issues reported by flake8 (forked from autoflake).

autoflake8 Introduction autoflake8 removes unused imports and unused variables from Python code. It makes use of pyflakes to do this. autoflake8 also

francisco souza 27 Sep 08, 2022
Rust like Option and Result types in Python

Option Rust-like Option and Result types in Python, slotted and fully typed. An Option type represents an optional value, every Option is either Some

45 Dec 13, 2022
Unbearably fast O(1) runtime type-checking in pure Python.

Look for the bare necessities, the simple bare necessities. Forget about your worries and your strife. — The Jungle Book.

beartype 1.4k Jan 01, 2023
Flake8 plugin to validate annotations complexity

flake8-annotations-complexity An extension for flake8 to report on too complex type annotations. Complex type annotations often means bad annotations

BestDoctor 41 Dec 28, 2022
A simple program which checks Python source files for errors

Pyflakes A simple program which checks Python source files for errors. Pyflakes analyzes programs and detects various errors. It works by parsing the

Python Code Quality Authority 1.2k Dec 30, 2022
A static type analyzer for Python code

pytype - 🦆 ✔ Pytype checks and infers types for your Python code - without requiring type annotations. Pytype can: Lint plain Python code, flagging c

Google 4k Dec 31, 2022
Utilities for refactoring imports in python-like syntax.

aspy.refactor_imports Utilities for refactoring imports in python-like syntax. Installation pip install aspy.refactor_imports Examples aspy.refactor_i

Anthony Sottile 20 Nov 01, 2022