Added counts to get better overview: grep -R '# pylint: disable' | sed 's/.*\(# pylint.*\)/\1/' | sort | uniq -c 1 Binary file .git/objects/pack/pack-b85cbf9c91a5ba2bc0e0f19ea9bcf9d8193c48d5.pack matches 3 # pylint: disable=abstract-method 18 # pylint: disable=assignment-from-no-return 22 # pylint: disable=attribute-defined-outside-init 195 # pylint: disable=broad-except 2 # pylint: disable=C0103 2 # pylint: disable=C0103, line-too-long 1 # pylint: disable=C0111 2 # pylint: disable=C0123 4 # pylint: disable=C0301 3 # pylint: disable=C0302 18 # pylint: disable=c-extension-no-member 7 # pylint: disable=c-extension-no-member, no-member 2 # pylint: disable=c-extension-no-member,no-member 19 # pylint: disable=comparison-with-callable 1 # pylint: disable=comparison-with-itself 4 # pylint: disable=consider-using-enumerate 2 # pylint: disable=consider-using-generator 46 # pylint: disable=consider-using-with 2 # pylint: disable=consider-using-with,attribute-defined-outside-init 4 # pylint: disable=cyclic-import 2 # pylint: disable=dangerous-default-value 2 # pylint: disable=E0012 1 # pylint: disable=E1101 2 # pylint: disable=E1102 3 # pylint: disable=E1111 8 # pylint: disable=expression-not-assigned 29 # pylint: disable=global-statement 1 # pylint: disable=global-statement,global-variable-not-assigned 4 # pylint: disable=inconsistent-return-statements 1 # pylint: disable=invalid-bool-returned, bad-option-value 1 # pylint: disable=invalid-length-returned 123 # pylint: disable=invalid-name 2 # pylint: disable=invalid-name,missing-docstring 2 # pylint: disable=invalid-name, unused-argument 1 # pylint: disable=invalid-sequence-index 2 # pylint: disable=invalid-str-returned 2 # pylint: disable=len-as-condition 20 # pylint: disable=line-too-long 3 # pylint: disable=line-too-long # noqa 4 # pylint: disable=logging-not-lazy 4 # pylint: disable=lost-exception 26 # pylint: disable=maybe-no-member 21 # pylint: disable=missing-docstring 1 # pylint: disable=missing-docstring, redefined-outer-name 12 # pylint: disable=missing-function-docstring 6 # pylint: disable=missing-kwoa 4 # pylint: disable-msg=too-many-arguments 2 # pylint: disable=no-else-break 2 # pylint: disable=no-else-continue 741 # pylint: disable=no-member 1 # pylint: disable=no-member,invalid-name 3 # pylint: disable=no-member,line-too-long 1 # pylint: disable=no-member, maybe-no-member 3 # pylint: disable=no-member # noqa 2 # pylint: disable=no-method-argument 58 # pylint: disable=no-name-in-module 1 # pylint: disable=no-name-in-module,wrong-import-order 2 # pylint: disable=non-parent-init-called 6 # pylint: disable=no-self-argument 1 # pylint: disable=not-a-mapping 6 # pylint: disable=not-callable 222 # pylint: disable=no-value-for-parameter 6 # pylint: disable=pointless-statement 123 # pylint: disable=protected-access 2 # pylint: disable=protected-access,c-extension-no-member,no-member 2 # pylint: disable=protected-access,no-member 2 # pylint: disable=R0401 2 # pylint: disable=R0902,R0904 1 # pylint: disable=R0904, C0111 1 # pylint: disable=R0904, C0111, C0302 3 # pylint: disable=R0904, C0302 3 # pylint: disable=R0913, C0302 2 # pylint: disable=raising-format-tuple 14 # pylint: disable=redefined-builtin 1 # pylint: disable=redefined-builtin,unused-argument 2 # pylint: disable=redefined-builtin,unused-argument,too-many-arguments 14 # pylint: disable=redefined-outer-name 6 # pylint: disable=redefined-outer-name,reimported 7 # pylint: disable=redefined-outer-name,reimported,unused-import 1 # pylint: disable=redefined-outer-name,unused-argument 2 # pylint: disable=reimported,unused-import,redefined-outer-name 2 # pylint: disable=self-assigning-variable 13 # pylint: disable=signature-differs 2 # pylint: disable=signature-differs # noqa: D403 2 # pylint: disable=singleton-comparison 4 # pylint: disable=subprocess-popen-preexec-fn 2 # pylint: disable=subprocess-popen-preexec-fn,consider-using-with 5 # pylint: disable=subprocess-run-check 7 # pylint: disable=super-init-not-called 2 # pylint: disable=syntax-error 3 # pylint: disable=too-few-public-methods 17 # pylint: disable=too-many-ancestors 270 # pylint: disable=too-many-arguments 2 # pylint: disable=too-many-arguments,inconsistent-return-statements 6 # pylint: disable=too-many-arguments, too-many-locals 26 # pylint: disable=too-many-arguments,too-many-locals 2 # pylint: disable=too-many-arguments,too-many-locals,too-many-branches 2 # pylint: disable=too-many-arguments,too-many-locals, too-many-statements 2 # pylint: disable=too-many-boolean-expressions 4 # pylint: disable=too-many-branches 1 # pylint: disable=too-many-function-args 78 # pylint: disable=too-many-instance-attributes 2 # pylint: disable=too-many-instance-attributes, too-many-arguments 2 # pylint: disable=too-many-instance-attributes,too-many-arguments,too-many-branches 2 # pylint: disable=too-many-instance-attributes,too-many-locals 2 # pylint: disable=too-many-instance-attributes,too-many-public-methods 14 # pylint: disable=too-many-lines 21 # pylint: disable=too-many-locals 6 # pylint: disable=too-many-locals,too-many-arguments 3 # pylint: disable=too-many-locals,too-many-arguments,invalid-name 3 # pylint: disable=too-many-locals,too-many-arguments, too-many-branches 4 # pylint: disable=too-many-locals,too-many-statements 71 # pylint: disable=too-many-nested-blocks 9 # pylint: disable=too-many-public-methods 18 # pylint: disable=too-many-return-statements 7 # pylint: disable=too-many-statements 5 # pylint: disable=undefined-variable 11 # pylint: disable=unexpected-keyword-arg 4 # pylint: disable=ungrouped-imports 4 # pylint: disable=unidiomatic-typecheck 1 # pylint: disable=unnecessary-lambda 18 # pylint: disable=unsubscriptable-object 4 # pylint: disable=unsupported-membership-test 1 # pylint: disable = unused-argument 188 # pylint: disable=unused-argument 1 # pylint: disable=unused-argument,invalid-name 1 # pylint: disable=unused-argument,line-too-long 2 # pylint: disable=unused-argument # pragma: no cover 3 # pylint: disable=unused-argument,too-many-arguments,too-many-locals 2 # pylint: disable=unused-argument, unused-variable 549 # pylint: disable=unused-import 2 # pylint: disable=unused-import,line-too-long 2 # pylint: disable=unused-import # noqa 2 # pylint: disable=unused-import # noqa: F401 4 # pylint: disable=unused-import # noqa: F401 8 # pylint: disable=unused-variable 1 # pylint: disable=unused-variable # noqa 4 # pylint: disable=using-constant-test 1 # pylint: disable=W0104 6 # pylint: disable=W0106 1 # pylint: disable=W0108 1 # pylint: disable=W0143 2 # pylint: disable=W0201 20 # pylint: disable=W0212 1 # pylint: disable=W0612 4 # pylint: disable=W0703 1 # pylint: disable=wildcard-import 5 # pylint: disable=wrong-import-order 5 # pylint: disable=wrong-import-position On Thu, Jun 24, 2021 at 10:53 AM Jarek Potiuk <ja...@potiuk.com> wrote: > > It could be survivor bias, but at least in my memory pretty much every > time I've seen something really serious, it's been also reported by > flake8 (which on its own is a combination of pep8, pyflakes + circular > complexity). > > Let me explain a bit more context that built up in my mind over the > last few months which made me change my mind. > > I think for such a tool, it is important to have as few > false-positives as possible. If you have a lot of false-positives, we > are basically trading both - contributor's and reviewers time on > analysing and explaining that "this is false positive" with the > potential of introducing a mistake like a typo. > > As a reviewer, this is a recurring pattern recently that the > contributor complains about a "new" problem reported in the code they > did not touch and then the reviewer has to get engaged and explain, > and iterate often resulting in having to rebase the PR (sometimes > again and again). > > When I look at our code: > > grep -R '# pylint: disable' | wc -l > 3370 > > find . -name '*.py' | wc -l > 4924 > > We have > 3000 false positives in our code and almost 5000 python files. > > Those false positives are time lost by both contributors and > reviewers. Those are the places where contributor and reviewer jointly > decided that it's not worth to fix the problem reported by pylunt. Is > 3370/4920 a lot ? I think so. > > Yes it might mean we should disable some rules possibly. But when I > look at those rules to disable, those are the very ones that we would > like to be able to discover. The list of those unique disables at the > end of the mail. > > If you look at the pyflakes (which is one of the three tools in > flake8) -> "Pyflakes makes a simple promise: it will never complain > about style, and it will try very, very hard to never emit false > positives." . I think it delivers. > > Pylint makes no such promise (and delivers as well). > > J. > > > #### Currently disabled pylint rules: > > grep -R '# pylint: disable' | sed 's/.*\(# pylint.*\)/\1/' | sort | uniq > # pylint: disable=abstract-method > # pylint: disable=assignment-from-no-return > # pylint: disable=attribute-defined-outside-init > # pylint: disable=broad-except > # pylint: disable=C0103 > # pylint: disable=C0103, line-too-long > # pylint: disable=C0111 > # pylint: disable=C0123 > # pylint: disable=C0301 > # pylint: disable=C0302 > # pylint: disable=c-extension-no-member > # pylint: disable=c-extension-no-member, no-member > # pylint: disable=c-extension-no-member,no-member > # pylint: disable=comparison-with-callable > # pylint: disable=comparison-with-itself > # pylint: disable=consider-using-enumerate > # pylint: disable=consider-using-generator > # pylint: disable=consider-using-with > # pylint: disable=consider-using-with,attribute-defined-outside-init > # pylint: disable=cyclic-import > # pylint: disable=dangerous-default-value > # pylint: disable=E0012 > # pylint: disable=E1101 > # pylint: disable=E1102 > # pylint: disable=E1111 > # pylint: disable=expression-not-assigned > # pylint: disable=global-statement > # pylint: disable=global-statement,global-variable-not-assigned > # pylint: disable=inconsistent-return-statements > # pylint: disable=invalid-bool-returned, bad-option-value > # pylint: disable=invalid-length-returned > # pylint: disable=invalid-name > # pylint: disable=invalid-name,missing-docstring > # pylint: disable=invalid-name, unused-argument > # pylint: disable=invalid-sequence-index > # pylint: disable=invalid-str-returned > # pylint: disable=len-as-condition > # pylint: disable=line-too-long > # pylint: disable=line-too-long # noqa > # pylint: disable=logging-not-lazy > # pylint: disable=lost-exception > # pylint: disable=maybe-no-member > # pylint: disable=missing-docstring > # pylint: disable=missing-docstring, redefined-outer-name > # pylint: disable=missing-function-docstring > # pylint: disable=missing-kwoa > # pylint: disable-msg=too-many-arguments > # pylint: disable=no-else-break > # pylint: disable=no-else-continue > # pylint: disable=no-member > # pylint: disable=no-member,invalid-name > # pylint: disable=no-member,line-too-long > # pylint: disable=no-member, maybe-no-member > # pylint: disable=no-member # noqa > # pylint: disable=no-method-argument > # pylint: disable=no-name-in-module > # pylint: disable=no-name-in-module,wrong-import-order > # pylint: disable=non-parent-init-called > # pylint: disable=no-self-argument > # pylint: disable=not-a-mapping > # pylint: disable=not-callable > # pylint: disable=no-value-for-parameter > # pylint: disable=pointless-statement > # pylint: disable=protected-access > # pylint: disable=protected-access,c-extension-no-member,no-member > # pylint: disable=protected-access,no-member > # pylint: disable=R0401 > # pylint: disable=R0902,R0904 > # pylint: disable=R0904, C0111 > # pylint: disable=R0904, C0111, C0302 > # pylint: disable=R0904, C0302 > # pylint: disable=R0913, C0302 > # pylint: disable=raising-format-tuple > # pylint: disable=redefined-builtin > # pylint: disable=redefined-builtin,unused-argument > # pylint: disable=redefined-builtin,unused-argument,too-many-arguments > # pylint: disable=redefined-outer-name > # pylint: disable=redefined-outer-name,reimported > # pylint: disable=redefined-outer-name,reimported,unused-import > # pylint: disable=redefined-outer-name,unused-argument > # pylint: disable=reimported,unused-import,redefined-outer-name > # pylint: disable=self-assigning-variable > # pylint: disable=signature-differs > # pylint: disable=signature-differs # noqa: D403 > # pylint: disable=singleton-comparison > # pylint: disable=subprocess-popen-preexec-fn > # pylint: disable=subprocess-popen-preexec-fn,consider-using-with > # pylint: disable=subprocess-run-check > # pylint: disable=super-init-not-called > # pylint: disable=syntax-error > # pylint: disable=too-few-public-methods > # pylint: disable=too-many-ancestors > # pylint: disable=too-many-arguments > # pylint: disable=too-many-arguments,inconsistent-return-statements > # pylint: disable=too-many-arguments, too-many-locals > # pylint: disable=too-many-arguments,too-many-locals > # pylint: disable=too-many-arguments,too-many-locals,too-many-branches > # pylint: disable=too-many-arguments,too-many-locals, too-many-statements > # pylint: disable=too-many-boolean-expressions > # pylint: disable=too-many-branches > # pylint: disable=too-many-function-args > # pylint: disable=too-many-instance-attributes > # pylint: disable=too-many-instance-attributes, too-many-arguments > # pylint: > disable=too-many-instance-attributes,too-many-arguments,too-many-branches > # pylint: disable=too-many-instance-attributes,too-many-locals > # pylint: disable=too-many-instance-attributes,too-many-public-methods > # pylint: disable=too-many-lines > # pylint: disable=too-many-locals > # pylint: disable=too-many-locals,too-many-arguments > # pylint: disable=too-many-locals,too-many-arguments,invalid-name > # pylint: disable=too-many-locals,too-many-arguments, too-many-branches > # pylint: disable=too-many-locals,too-many-statements > # pylint: disable=too-many-nested-blocks > # pylint: disable=too-many-public-methods > # pylint: disable=too-many-return-statements > # pylint: disable=too-many-statements > # pylint: disable=undefined-variable > # pylint: disable=unexpected-keyword-arg > # pylint: disable=ungrouped-imports > # pylint: disable=unidiomatic-typecheck > # pylint: disable=unnecessary-lambda > # pylint: disable=unsubscriptable-object > # pylint: disable=unsupported-membership-test > # pylint: disable = unused-argument > # pylint: disable=unused-argument > # pylint: disable=unused-argument,invalid-name > # pylint: disable=unused-argument,line-too-long > # pylint: disable=unused-argument # pragma: no cover > # pylint: disable=unused-argument,too-many-arguments,too-many-locals > # pylint: disable=unused-argument, unused-variable > # pylint: disable=unused-import > # pylint: disable=unused-import,line-too-long > # pylint: disable=unused-import # noqa > # pylint: disable=unused-import # noqa: F401 > # pylint: disable=unused-import # noqa: F401 > # pylint: disable=unused-variable > # pylint: disable=unused-variable # noqa > # pylint: disable=using-constant-test > # pylint: disable=W0104 > # pylint: disable=W0106 > # pylint: disable=W0108 > # pylint: disable=W0143 > # pylint: disable=W0201 > # pylint: disable=W0212 > # pylint: disable=W0612 > # pylint: disable=W0703 > # pylint: disable=wildcard-import > # pylint: disable=wrong-import-order > # pylint: disable=wrong-import-position > > > On Thu, Jun 24, 2021 at 1:57 AM Tomasz Urbaszek <turbas...@apache.org> wrote: > > > > -0.5 from me. Black and flake8 does not guarantee the same quality and > > consistency of code as pylint (for example using if list instead of if > > len(list) > 0 ). > > > > > I can't remember the last time where pylint prevented any real error > > > > Well, isn't it a survivor bias (the one usually represented by this picture > > of airplane)? > > > > Pylint is slow and sometimes brittle but I think it may help. What I would > > consider is to keep pylint for providers - this code in particular is > > created and changed by plenty of people with different backgrounds and > > standards. > > > > Tomek > > > > On Wed, 23 Jun 2021 at 21:45, Jarek Potiuk <ja...@potiuk.com> wrote: > >> > >> Just to be precise - the vote will end on Monday 28th at 8.30 PM CEST > >> (to account for weekend) ... > >> > >> J. > >> > >> On Wed, Jun 23, 2021 at 9:29 PM Kaxil Naik <kaxiln...@gmail.com> wrote: > >> > > >> > +1 -- Pylint is proving to be a headache and is very very slow locally > >> > this days > >> > > >> > On Wed, Jun 23, 2021 at 8:02 PM Jarek Potiuk <ja...@potiuk.com> wrote: > >> >> > >> >> Why not +10000 Ash :) ? > >> >> > >> >> On Wed, Jun 23, 2021 at 9:00 PM Andrew Godwin > >> >> <andrew.god...@astronomer.io.invalid> wrote: > >> >> > > >> >> > I can't cast a binding vote on this, but I would also like to chime > >> >> > in with support for this move. We have plenty of protection from > >> >> > everything else, and while we could try to go through pylint and > >> >> > disable every superfluous check, I'm not sure it's worth it. > >> >> > > >> >> > Andrew > >> >> > > >> >> > On Wed, Jun 23, 2021 at 12:49 PM Ash Berlin-Taylor <a...@apache.org> > >> >> > wrote: > >> >> >> > >> >> >> Clearly I'm +7000 on this. > >> >> >> > >> >> >> On 23 June 2021 19:38:13 BST, Xinbin Huang <bin.huan...@gmail.com> > >> >> >> wrote: > >> >> >>> > >> >> >>> I would like to deprecate it too, so count +1 from me. One question > >> >> >>> I have is: do we have any ways to detect and prevent cyclic imports? > >> >> >>> > >> >> >>> On Wed, Jun 23, 2021 at 11:30 AM Jarek Potiuk <ja...@potiuk.com> > >> >> >>> wrote: > >> >> >>>> > >> >> >>>> I think this subject has been raised a few times (last time by > >> >> >>>> Ash). > >> >> >>>> Finally I grew up to embrace it as well. > >> >> >>>> > >> >> >>>> I think I am also fed-up by random pylint errors. Last time > >> >> >>>> https://github.com/apache/airflow/pull/15634/checks?check_run_id=2896761068 > >> >> >>>> > >> >> >>>> We have many, many pylint exceptions all over our code. I can't > >> >> >>>> remember the last time where pylint prevented any real error. As > >> >> >>>> Ash > >> >> >>>> (rightfully) mentioned in latest discussion on slack - we have > >> >> >>>> mypy/flake/isort/black which report (and fix) vast majority of > >> >> >>>> things > >> >> >>>> pylint reports. > >> >> >>>> > >> >> >>>> I think this last error was the final drop for me. > >> >> >>>> > >> >> >>>> Should we remove pylint ? > >> >> >>>> > >> >> >>>> Consider it +1 from my side. > >> >> >>>> > >> >> >>>> J . > >> >> >>>> > >> >> >>>> > >> >> >>>> -- > >> >> >>>> +48 660 796 129 > >> >> > >> >> > >> >> > >> >> -- > >> >> +48 660 796 129 > >> > >> > >> > >> -- > >> +48 660 796 129 > > > > -- > +48 660 796 129
-- +48 660 796 129