Giter Club home page Giter Club logo

pylint-ignore's Introduction

Start with silence, not with noise. But do start!

Project/Repo:

MIT License Supported Python Versions CalVer 2022.1025 PyPI Version PyPI Downloads

Code Quality/CI:

GitHub CI Status GitLab CI Status Type Checked with mypy Code Coverage Code Style: sjfmt

Name role since until
Manuel Barkhau ([email protected]) author/maintainer 2020-06 -

Developer Ergonomics

The main issue with Pylint is developer ergonomics. The messages produced by Pylint can be valuable, but you have to put in some work before you can use it productively. If you have an established codebase, you'll probably have to:

  • research configuration options
  • disable many unhelpful messages
  • blindly litter your code with pylint:disable comments.

Using Pylint-Ignore you can benefit from Pylint today. You won't have to wade through endless message noise first, won't have to spend time with configuration, you won't have to change anything about your code. Even though you start with all messages ignored for existing code, you can benefit from Pylint right away for any new code you write.

What about the wall of messages for your existing code? Well, at least you can gradually improve your situation, as you have time for it. In other words, you may be dug into a hole right now, but at least you can stop digging yourself any deeper and gradually start climbing back out.

How it Works

The pylint-ignore command is a thin wrapper around the pylint package. You can get started immediately by running the following commands:

$ pip install pylint-ignore

Installing collected packages: astroid,isort,pylint,pylint-ignore
...
Successfully installed pylint-ignore-2020.1006

$ pylint-ignore src/

************* Module src/mymodule.py
src/mymodule.py:290:0: W0102: Dangerous default value sys.argv[1:] (builtins.list) as argument (dangerous-default-value)
...

-------------------------------------------------------------------
Your code has been rated at 9.92/10

$ echo $?     # exit status != 0
28

The pylint-ignore command reads a file called pylint-ignore.md, which you should keep as part of your repository. This file contains messages that should be ignored and it is automatically updated with new entries if you specify the --update-ignorefile parameter.

$ pylint-ignore src/ --update-ignorefile

-------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 9.92/10, +0.08)

$ echo $?     # exit status == 0
0

The original message no longer shows up in the output, and it is instead logged in the pylint-ignore.md, which will now look something like this:

...
## File src/mymodule.py - Line 290 - W0102 (dangerous-default-value)

- message: Dangerous default value sys.argv[1:] (builtins.list) as argument
- author : Manuel Barkhau <[email protected]>
- date   : 2020-07-17T21:15:25

```
  289:
> 290: def main(args: Sequence[str] = sys.argv[1:]) -> ExitCode:
  291:     try:
```

Ideally, you should only do this once when you start to use Pylint, and going forward the file will only get smaller. As your time permits, the recommended approach to using pylint-ignore is the following:

  1. If a message refers to a valid issue (errors and warnings in particular), update your code so the issue is resolved.
  2. If a message is a false positive, add a comment of this form to your code: # pylint:disable=<symbol> ; explain why this is a false positive
  3. If it is a useless message (e.g. a whitespace rule that conflicts with the behaviour of your code formatter) which should always be ignored, then do so via your pylintrc or setup.cfg file.

In principal these are the same options you have when using Pylint by itself. For the above example, dangerous-default-value is a useful message in general) just not in this particular case. You might take the approach of option 2. and add a pylint:disable comment:

def main(args: Sequence[str] = sys.argv[1:]) -> ExitCode:
    # pylint:disable=dangerous-default-value;  args is not mutated
    # mypy prevents this because Sequence[str] does not support mutation
    try:

With this change, the next time you run pylint-ignore --update-ignorefile, the corresponding entry will disappear and the backlog will shrink.

CLI Usage

The pylint-ignore command has only two options, any other options on the command line are passed-through to pylint. For example, pylint-ignore --help will behave exactly the same as pylint --help. The options pylint-ignore provides are:

Usage: pylint-ignore [options]

Options:
  --ignorefile=<FILE>    Path to ignore file [default: pylint-ignore.md]
  --update-ignorefile    Update the ignorefile, adds new messages,
                         removes any messages that are no longer
                         emmitted by pylint (were fixed or disabled)

Normally the pylint-ignore command will not update the pylint-ignore.md file. This is appropriate for

  • Normal development if it's your policy to not introduce any new issues.
  • CI/CD build systems, where you want to report any issues that were newly introduced.

If you fix an issue or explicitly disable a message, you can cleanup obsolete entries by adding the --update-ignorefile argument. For example:

$ pylint-ignore --update-ignorefile src/ test/

Caveat: If you change some code for which there is an entry in the pylint-ignore.md file, the entry may no longer be matched up with the message as it is generated by Pylint. Usually, changes in line numbers will be detected as long as the code itself did not change and your build will not fail if that is the case. Hopefully you will not feel the need to habitually use --update-ignorefile but you may need to use it occasionally, simply to refresh an existing entry that became invalid. You can of course also take such an occasion as an opportunity to deal with the underlying issue.

Integration with pre-commit

pylint-ignore can be used as a pre-commit hook, but inherits the limitations of pylint described in Pre-commit integration.

To include pylint-ignore as a pre-commit hook using the provided plugin, add the following entry to a .pre-commit-config.yaml file in the repository being linted:

  - repo: https://github.com/mbarkhau/pylint-ignore
    rev: "2021.1024"
    hooks:
      - id: pylint-ignore

If you find that pylint will only function correctly when run in the local Python environment (as described in Pre-commit integration) then the following local hook entry can instead be used for pylint-ignore:

repos:
  - repo: local
    hooks:
      - id: pylint-ignore
        name: pylint-ignore
        entry: pylint-ignore
        language: system
        types: [python]
        require_serial: true
        # args: [
        #   "--rcfile",
        #   "setup.cfg",
        #   "src/",
        #   "test/",
        #   "--ignore-paths",
        #   "scripts/,fixtures/,setup.py",
        # ]

The args: [...] property can be added to the entries as required.

To test you can use pre-commit run:

$ pre-commit run pylint-ignore --all-files

Configuration

Pylint's behaviour can be configured in the usual way, see Command-line arguments and configuration files for details.

The pylint-ignore.md file

You can view an example file here: fixtures/pylint-ignore.md. You can consider this file as a backlog of possible issues. The entries are sorted first by category, i.e. errors and warnings first then by frequency. You can change the path/filename using the --ignorefile parameter: pylint-ignore --ignorefile=etc/pylint-backlog.md

The pylint-ignore.md file uses a bespoke format but it is valid markdown. This choice is primarily so that you can read it and review it more easily on platforms such as github/gitlab/bitbucket. You don't have to edit the file and it is not a format that any other program has to parse, so I think this is a reasonable choice.

What does this approach solve, why not just use Pylint by itself?

Why use Pylint-Ignore

Problem 1: Noise

There is a reason flake8 is used so much more often than Pylint. The problem of "noise" is acknowledged early in the documentation of Pylint. In fact, the frustration of using Pylint is so obvious that it is even the topic of the project's tag-line: "It's not just a linter that annoys you!".

Pylint-Ignore doesn't get rid of this noise of course, but it does put in a dedicated place, rather than Spam in your terminal. Each issue with your code is one entry in a file, rather than a line that you have to scan again and again.

Once you've established silence as your baseline, you can trust that you only have to deal with two states: OK and FAIL. This vastly reduces cognitive load for developers and makes it possible for you to integrate the linter into your CI system, even if you haven't yet dealt with every last Pylint message.

Problem 2: Setup Cost

I won't belabour this point, but it's better if you can spend as little time as possible to just get started using a useful tool, rather than putting it off into the future, possibly indefinitely or only using it occasionally rather than making it a part of your regular workflow.

That being said, the sooner you take the time to pay down this setup cost, and to disable messages in your configuration that are actual noise, the more useful Pylint will be for you. Every useless message will increase the likelihood that you miss one of the more important messages.

Even if you've setup Pylint perfectly and are done with the initial cleanup of your codebase, there might be reason for you to continue to use Pylint-Ignore in your development workflow.

Problem 3: Diligence is Scarce

Without Pylint-Ignore, chances are, you (or your teammates) will be overzealous with the disable section of your configuration. Sooner or later, you will be short on time and effectively turn the linter off. Who will later know or care to look if the message was disabled because it is genuinely useless or if you just had other priorities at that moment? You can try to remind yourself to review things, you can add a TODO comment which you hopefully remember to grep for regularly, but there is a high chance that such good intentions will sooner or later go by the wayside.

With Pylint-Ignore, you have a dedicated file in your repository, which is more explicit and visible than the other options. The entries are ordered by importance, rather than appearing more or less randomly on your terminal. You can focus your diligence on other things, and deal with minor linting issues when you have time, or perhaps leave them open as a first contribution for a new member of your team, just so they can get used to your workflow.

Problem 4: Malicious Compliance

You may find some messages useful, but with an existing codebase, the work would be too much at once. You don't want to disable it, but you don't want to start with it enabled either. An example is perhaps the missing-function-docstring message. If you were to enabled it, you may find a pattern like this emerge:

def get_author_name() -> str:
    """Gets the author name and returns it as a string."""

In case it's not obvious, the above doc-string is redundant, it adds no new information relative to what is already contained in the function name and types. In other words, the temptation is to pacify the linter by changing the code in ways that are at best a useless waste of time and at worst they are malicious and counterproductive.

You are in control, as you can just ignore and commit a change if you feel that ignoring the linter is justified by your current priorities. With Pylint-Ignore you don't have to halt the train because a delicate flower fainted in wagon 2 fainted at the sight of oil spraying all over her luggage and make your journey on-time. The pylint-ignore.md will keep track of the issue and you can deal with it once you've arrived at the station, not while you're running at full steam.

Problem 5: False Positives

While you can and should deal with most false positives using disable comments, there are some cases where you'd rather not do that and some cases where that isn't even possible. For such edge cases, you can just permanently leave an entry in the pylint-ignore.md and still benefit from an otherwise useful message if new cases pop up.

Motivation/Why use Pylint

If you are not convinced of the usefulness of Pylint, linters, or static analysis in general (and perhaps think they are mostly make-work for people who are overly pedantic) let me show you what convinced me to use Pylint.

Dynamic Code and Scope Related Bugs

Some code may syntactically valid Python and will even execute without raising an error and yet is almost certainly not what the author intended. To be sure, if you have proper testing, you will catch such bugs, but even so, static analysis may pay its dues if it can help you catch such bugs more quickly.

def frobnicate(seq: Sequence[int]):
    total = 0
    for value in seq:
        total += value
    return value / len(seq)

The above code will "work", depending on how you call it, it won't even throw an error and yet it is almost certainly not correct. Were the function longer than 5 lines, the bug would perhaps be less obvious. Just recently I spent at least an hour tracking down such a bug, which had made it into production. In any case, Pylint will report the following message for such code:

W0631: Using possibly undefined loop variable 'value'
  (undefined-loop-variable)

There are other messages, related to name shadowing and unused arguments that I have found to be particularly useful in that they have pointed to actual bugs, rather than "mere" preferences or "best-practices" according to the authors of Pylint.

Supporting Code Review

The perhaps most important aspect of a linter, whenever working with other people, is that the feedback related to mundane issues of code styling will come from a computer rather than from another person. This is a benefit, both the reviewer and to the author:

  • It is not fun to spend valuable time on giving repetitive feedback on mundane issues that can be automated.
  • It's not fun, perhaps even embarrassing to have your own stupid mistakes be pointed out during review.

A linter also allows you to establish a rule that will end discussions about subjective style preferences. Everybody might agree that any particular style is stupid, but the endless discussion about code style is even more stupid. So, establish this rule: If it passes the linter, the discussion is over (except of course if the linter only passes because it was maliciously disabled). This is a similar argument as is made for the use of code formatters and its main value is that it allows you to focus your review time on the actual problem related to the code.

Catching Python Gotchas

Junior programmers and even (experienced programmers who are new to Python) may not be aware of common pitfalls of working with Python. They need every help they can get and you can look at static analysis as a form of codified knowledge and automated communication from experienced programmers. The code that you write may be perfect, but hell is other people, and Pylint can help to keep some minimum standards in your projects, even when you on-board new developers.

A Nudge to Improve

When you're hacking away, focused entirely on solving the actual problem, getting the actual workβ„’ done, you can end up with some code that may well work, may well pass all of your tests, may well be efficient and may even be (let's just postulate for the sake of argument) optimal and correct. That still doesn't mean, that anybody but the author can understand it.

R0902 Too many instance attributes (10/7) (too-many-instance-attributes)

Simple code metrics such as too-many-locals, too-many-branches, etc. may well be subjective, pedantic, paternalistic gamification nonsense, and of course such metrics should not be turned into targets. The question is, how do you use them. If they are triggering very often, then the threshold may well be too low and you should increase it to a tolerable level. If your code is perfect as it is, then there is no shame, perhaps it's even a badge of honor to add a comment such as this:

class ToCoolForSchool():
    # pylint:disable=too-many-branches
    # behold this glorious perfection 🀘 β€” [email protected]
    ...

Such cases aside, a common reason for complicated code is that the author was too lazy didn't have the time to re-factor their code so that others could also understand it. I would caution against code-golfing such cases, just to satisfy the linter. Just consider the message as a nudge to at least take a second look, to a least consider looking for obviously better ways to structure your code.

Alternatives

To the extent that the excessive noise of Pylint has scared you away from using it, I hope you will find pylint-ignore helpful to at least get started. Here is another approach you may prefer.

Selective Opt-In

An alternative approach is suggested by Itamar Turner-Trauring with "Why Pylint is both useful and unusable, and how you can actually use it" is in essence to do the following:

  • First, setup Pylint to do nothing: disable all messages
  • Selectively enable some checks and keep them if they are valuable
  • Repeat

Obviously, this is abbreviated, so I encourage you to read his article if selective whitelisting is a better approach for you. For me, this approach suffers from the diligence issue, as it requires you to revisit the configuration at least a few times, keep track of what you've found to be valuable and so you run a higher risk of neglecting it.

Automated disable comments

Another automated approach is to use pylint-silent. Be sure to use version control if you consider this approach.

pylint-ignore's People

Contributors

berland avatar davidsheldon avatar dector avatar mbarkhau avatar s-t-e-v-e-n-k avatar stdedos avatar

Stargazers

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

Watchers

 avatar  avatar

pylint-ignore's Issues

Trailing whitespace in otherwise empty lines can't be ignored

First of all, thank you for this project. I gave it a quick test yesterday and really like the improvement over stock pylint. Having used rupocop in the past, this is a feature I am really missing from pylint. We want to (re-)introduce pylint to our code base and pylint-ignore will be of great help.

The issue I have is that, after running pylint-ignore --update-ignorefile, pylint-ignore still reports "Trailing whitespace" messages. I tracked it down to lines that are empty except for whitespace and also took a look at the code, but didn't yet find a way to fix it myself.

This is a minimal reproducer:
Content of ~/tmp/pylint-ignore-repro/repro.py (note the whitespace in the empty line):

def repro():
    
    return None

Initial pylint-ignore execution:

~/tmp/pylint-ignore-repro  
$ pylint-ignore repro.py
************* Module repro
repro.py:4:0: C0303: Trailing whitespace (trailing-whitespace)
repro.py:1:0: C0114: Missing module docstring (missing-module-docstring)
repro.py:3:0: C0116: Missing function or method docstring (missing-function-docstring)

------------------------------------
Your code has been rated at -5.00/10

Updating pylint-ignore.md:

~/tmp/pylint-ignore-repro  
$ pylint-ignore repro.py --update-ignorefile

---------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: -5.00/10, +15.00)

Running pylint-ignore again:

~/tmp/pylint-ignore-repro  
$ pylint-ignore repro.py                    
************* Module repro
repro.py:4:0: C0303: Trailing whitespace (trailing-whitespace)

-------------------------------------------------------------------
Your code has been rated at 5.00/10 (previous run: 10.00/10, -5.00)

I put the resulting pylint-ignore.md in the Details drawer below because it's pretty large. I can also attach it in another format if needed. The "suprising" thing is that the EntryHeader has no line number. When I manually added the line number (but nothing else!), the message got ignored as expected.

~/tmp/pylint-ignore-repro $ cat pylint-ignore.md

Pylint-Ignore

WARNING: This file is programatically generated.

This file is parsed by pylint-ignore
to determine which
Pylint messages
should be ignored.

  • Do not edit this file manually.
  • To update, use pylint-ignore --update-ignorefile

The recommended approach to using pylint-ignore is:

  1. If a message refers to a valid issue, update your code rather than
    ignoring the message.
  2. If a message should always be ignored (globally), then to do so
    via the usual pylintrc or setup.cfg files rather than this
    pylint-ignore.md file.
  3. If a message is a false positive, add a comment of this form to your code:
    # pylint:disable=<symbol> ; explain why this is a false positive

Overview

C0114: missing-module-docstring

File repro.py - C0114 (missing-module-docstring)

  • message: Missing module docstring
  • author : Alexander Graul <[email protected]>
  • date : 2021-06-24T15:21:44

C0116: missing-function-docstring

File repro.py - Line 3 - C0116 (missing-function-docstring)

  • message: Missing function or method docstring
  • author : Alexander Graul <[email protected]>
  • date : 2021-06-24T15:21:44
  1: #!/usr/bin/python3
  2:
> 3: def repro():
  4:
  5:     return None

C0303: trailing-whitespace

File repro.py - C0303 (trailing-whitespace)

  • message: Trailing whitespace
  • author : Alexander Graul <[email protected]>
  • date : 2021-06-24T15:21:44

Versions in my virtual environment:

~/tmp/pylint-ignore-repro  
$ python --version            
Python 3.9.5

~/tmp/pylint-ignore-repro  
$ pip list                    
Package           Version
----------------- ---------
astroid           2.5.6
isort             5.9.1
lazy-object-proxy 1.6.0
mccabe            0.6.1
pathlib2          2.3.5
pip               21.1.2
pylev             1.4.0
pylint            2.8.3
pylint-ignore     2021.1018
setuptools        56.0.0
six               1.16.0
toml              0.10.2
wrapt             1.12.1

If you have any pointers I could give fixing this another try. If you need anything else, I'm happy to hand over any information that helps you.

[Bug] Run `pylint-ignore --update-ignorefile` got AssertionError

Hi mbarkhau,

I just got an error when the first time I ran pylint-ignore --update-ignorefile {my_package}.

Here is the error code I got:

Traceback (most recent call last):
  File "/opt/conda/bin/pylint-ignore", line 8, in <module>
    sys.exit(main())
  File "/opt/conda/lib/python3.7/site-packages/pylint_ignore/__main__.py", line 307, in main
    pylint.lint.Run(dec.pylint_run_args)
  File "/opt/conda/lib/python3.7/site-packages/pylint/lint/run.py", line 344, in __init__
    linter.check(args)
  File "/opt/conda/lib/python3.7/site-packages/pylint/lint/pylinter.py", line 871, in check
    self.get_ast, self._iterate_file_descrs(files_or_modules)
  File "/opt/conda/lib/python3.7/site-packages/pylint/lint/pylinter.py", line 904, in _check_files
    self._check_file(get_ast, check_astroid_module, name, filepath, modname)
  File "/opt/conda/lib/python3.7/site-packages/pylint/lint/pylinter.py", line 930, in _check_file
    check_astroid_module(ast_node)
  File "/opt/conda/lib/python3.7/site-packages/pylint/lint/pylinter.py", line 1063, in check_astroid_module
    ast_node, walker, rawcheckers, tokencheckers
  File "/opt/conda/lib/python3.7/site-packages/pylint/lint/pylinter.py", line 1105, in _check_astroid_module
    checker.process_tokens(tokens)
  File "/opt/conda/lib/python3.7/site-packages/pylint/checkers/format.py", line 1023, in process_tokens
    self._process_retained_warnings(TokenWrapper(tokens), idx)
  File "/opt/conda/lib/python3.7/site-packages/pylint/checkers/format.py", line 1118, in _process_retained_warnings
    self._add_continuation_message(state, hints, tokens, indent_pos)
  File "/opt/conda/lib/python3.7/site-packages/pylint/checkers/format.py", line 1172, in _add_continuation_message
    hint_line,
  File "/opt/conda/lib/python3.7/site-packages/pylint/checkers/base_checker.py", line 111, in add_message
    self.linter.add_message(msgid, line, node, args, confidence, col_offset)
  File "/opt/conda/lib/python3.7/site-packages/pylint_ignore/__main__.py", line 242, in add_message
    confidence)
  File "/opt/conda/lib/python3.7/site-packages/pylint/message/message_handler_mix_in.py", line 237, in add_message
    message_definition, line, node, args, confidence, col_offset
  File "/opt/conda/lib/python3.7/site-packages/pylint/message/message_handler_mix_in.py", line 274, in add_one_message
    if not self.is_message_enabled(message_definition.msgid, line, confidence):
  File "/opt/conda/lib/python3.7/site-packages/pylint_ignore/__main__.py", line 275, in is_message_enabled
    return is_any_message_def_enabled(linter, msg_descr, line)
  File "/opt/conda/lib/python3.7/site-packages/pylint_ignore/__main__.py", line 255, in is_any_message_def_enabled
    assert not (msg_extra and srctxt)
AssertionError

Best regards,

Shem

Unable to share pylint-ignore.md on cross-platform project

The filenames should be canonicalised (just replace \ with /), so that when pylint-ignore is created on windows, it ignores errors on linux, and vice versa.

You end up with the filenames flip-flopping in VCS, and a lot of linting errors on the platform that didn't last run the re-generator.

TypeError: '<' not supported between instances of 'int' and 'NoneType'

Running

pylint-ignore --update-ignorefile --ignorefile=pylint-ignore.md src/

gives me

-------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 5.07/10, +4.93)

Traceback (most recent call last):
  File "gKDsaKU3/bin/pylint-ignore", line 8, in <module>
    sys.exit(main())
  File "gKDsaKU3/lib/python3.6/site-packages/pylint_ignore/__main__.py", line 320, in main
    ignorefile.dump(new_catalog, dec.ignorefile_path)
  File "gKDsaKU3/lib/python3.6/site-packages/pylint_ignore/ignorefile.py", line 377, in dump
    ignorefile_text = dumps(ignorefile)
  File "gKDsaKU3/lib/python3.6/site-packages/pylint_ignore/ignorefile.py", line 354, in dumps
    entries = sorted(ignorefile.values(), key=_entry_priority)
TypeError: '<' not supported between instances of 'int' and 'NoneType'

Code is not public but I guess that root-cause might be somewhere in _entry_priority() around

entry.srctxt and entry.srctxt.new_lineno,

Integration with pre-commit (add a `.pre-commit-hooks.yaml` file)

Thanks for writing pytlint-ignore! I'm trying it out now and I'd like to integrate it with pre-commit https://pre-commit.com/ both locally and in the GitLab CI pipeline. This will require me to write a repository local hook because the "official repository for the linter doesn't have the pre-commit metadata". This isn't necessarily a big problem, but it's pretty simple for that metadata to be added to this repo as a .pre-commit-hooks.yaml file. Would you be open to adding that metadata file, please?

Test fixtures not in published package

I'm trying to build an RPM from the package at PyPI and part of the build process is to run a package's testsuite in the build environment. Tests that need the fixtures fail because the fixtures directory is not part of the source tarball (downloaded from PyPI). I can work around that by adding another source tarball that contains the fixtures, but it would be great if the fixtures were part of the released tarball.

Short test summary with list of failed tests:

[    4s] =========================== short test summary info ============================
[    4s] FAILED test/test_ignorefile.py::test_read_source_lines - FileNotFoundError: [...
[    4s] FAILED test/test_ignorefile.py::test_read_source_text - FileNotFoundError: [E...
[    4s] FAILED test/test_ignorefile.py::test_find_source_text_lineno - pylint_ignore....
[    4s] ERROR test/test_ignorefile.py::test_iter_entry_values - FileNotFoundError: [E...
[    4s] ERROR test/test_ignorefile.py::test_load - FileNotFoundError: [Errno 2] No su...
[    4s] ERROR test/test_ignorefile.py::test_dump - FileNotFoundError: [Errno 2] No su...
[    4s] ERROR test/test_ignorefile.py::test_find_entry - FileNotFoundError: [Errno 2]...
[    4s] ERROR test/test_main.py::test_selftest_no_ignore_update - FileNotFoundError: ...
[    4s] ERROR test/test_main.py::test_selftest_ignore_update_noop - FileNotFoundError...

This is the error that I see multiple times:

[    4s] E       FileNotFoundError: [Errno 2] No such file or directory: '/home/abuild/rpmbuild/BUILD/pylint-ignore-2021.1018/fixtures'

Integration in pylint directly ?

Hello, pylint maintainer here.

This project looks great ! I really like the logo, but it also seems to already have a lot of features and a nice overall code design too.

We happen to have an issue to have a similar feature directly in pylint (pylint-dev/pylint#5403)

What's your opinion on it ? Would it make sense to include pylint-ignore inside pylint directly ? Should we simply advertise pylint-ignore and/or pylint-silent as a solution in the doc and close our baseline issue?

Thanks in advance for your insight.

`MessagesHandlerMixIn` has been removed in `2.12`

pylint contributor here:

One of our issues got tagged in another project, but the actual problem was in this project. With 2.12 we removed MessagesHandlerMixIn and merged it into the general PyLinter class. pylint-ignore is importing it and this is creating crashes. A quick search showed me that you're using it to patch certain functions. Perhaps there is anything we could do to provide you the things you need from pylint directly?

The issue I'm referring to is wapiti-scanner/wapiti#199
I'm tagging @JulienTD as you might be interested to see when this is fixed so you can remove the pin on pylint πŸ˜„

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.