Repository navigation
PYLINT_FLAGS loads a plugin that does not exist, so compare-to-empty-string never runs #767
Description
Activity
- addedbugIssues reporting a defect (set by the bug report template; a default, not an assessment)Issues reporting a defect (set by the bug report template; a default, not an assessment)ciPull requests that change CI or workflow configuration (ci: subject prefix)Pull requests that change CI or workflow configuration (ci: subject prefix)
on Sep 25, 2026 Correcting this issue: its central claim is wrong, and it is my error. The check has not "never run".
--enable=compare-to-empty-stringresolves through anold_namesalias touse-implicit-booleaness-not-comparison-to-string(C1804) in pylint's corerefactoringchecker, which loads regardless of the failed plugin. Measured under the old, unmodified flag set:$ pylint <OLD PYLINT_FLAGS, broken plugin included> --list-msgs-enabled | grep C1804 use-implicit-booleaness-not-comparison-to-string (C1804)
A full
--list-msgs-enableddiff between the old and new flag sets is identical — 399 lines each,diffexit 0. So dropping the dead plugin is a pure no-op on message selection. The check was enabled and running the whole time; it simply fires zero times acrosspcapkit/.What is actually true here, and worth keeping:
pylint.extensions.emptystringis genuinely absent from pylint 4.0.8, so--load-plugins=fails every run and emitsE0013 bad-plugin-value. That is real but narrow: one non-file message, inflating the raw error count by one (91 vs the file-scoped 90).- The flag list carries four more entries that resolve to nothing:
old-division,no-absolute-importandinput-builtinwere deleted from pylint (R0022), andeq-without-hashemitsW0012.
One more of my characterisations was wrong. I called
eq-without-hashstale alongside the three deleted ones. It is not — the check is live asW1641, merely moved to an extension:$ python -c "import importlib.util as u; print(u.find_spec('pylint.extensions.eq_without_hash'))" <ModuleSpec name='pylint.extensions.eq_without_hash' ...> # PRESENT $ python -c "import importlib.util as u; print(u.find_spec('pylint.extensions.emptystring'))" None # MISSING
So
eq-without-hashis inert only because that extension is not loaded — exactly the distinction that applies toemptystring, and the opposite of "removed". Its impact today is nil (W1641count overpcapkit/is 0), but whether to load that extension is now an open question rather than a settled cleanup.So the issue stands as flag hygiene plus one
E0013, not as a check that never ran. #773 fixes the hygiene correctly; only the rationale needs restating.- addedwipWork in flight - a covering PR is open or an agent is actively on itWork in flight - a covering PR is open or an agent is actively on it
on Sep 25, 2026 - added 5 commits that reference this issue
on Sep 25, 2026 - removedwipWork in flight - a covering PR is open or an agent is actively on itWork in flight - a covering PR is open or an agent is actively on it
on Sep 25, 2026
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Describe the bug
PYLINT_FLAGSloadspylint.extensions.emptystring, which does not exist in the installed pylint.The
--load-plugins=entry fails, and--enable=compare-to-empty-string— the check that pluginexists to provide — is therefore inert. It has never run.
Reproduction
pylint reports it every run, as a non-file message:
The other three plugins (
check_elif,docstyle,overlapping_exceptions) are present.Expected behavior
Either
compare-to-empty-stringruns, or the flags stop asking for it. A silently inert check isworse than an absent one, because the flag list reads as though the project enforces it.
Additional context
Two consequences beyond the dead check. It is a fifth stale
PYLINT_FLAGSentry alongside thefour already known (
eq-without-hash→W0012, andold-division/no-absolute-import/input-builtin→R0022). And it is class E, so it inflates the error count by one: file-scopedE is 90, while the raw count is 91. pylint's own
messageTypeCountagrees aterror: 90, warning: 4765, refactor: 642, convention: 542.That last part matters for #753 — any pinned E figure has to state whether it includes this message.
Found in the cross-review of #761.