Skip to content

Commit 4f5d227

Browse files
erikwrightPCManticore
authored andcommitted
Optimize effect of disabling import warnings
Disabling 'wrong-import-order' or 'wrong-import-position' for a single line now prevents that line from triggering violations on subsequent lines.
1 parent a53028d commit 4f5d227

File tree

5 files changed

+38
-8
lines changed

5 files changed

+38
-8
lines changed

ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ Release date: 2017-04-13
7272

7373
Close #1342
7474

75+
* Disabling 'wrong-import-order' or 'wrong-import-position' for a single line now
76+
prevents that line from triggering violations on subsequent lines.
77+
78+
Close #1336
79+
7580
* Added a new error, 'used-prior-global-declaration', which is emitted when a name
7681
is used prior a global declaration in a function. This causes a SyntaxError in
7782
Python 3.6

pylint/checkers/imports.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,8 @@ def leave_module(self, node):
444444
self._first_non_import_node = None
445445

446446
def compute_first_non_import_node(self, node):
447+
if not self.linter.is_message_enabled('wrong-import-position', node.fromlineno):
448+
return
447449
# if the node does not contain an import instruction, and if it is the
448450
# first node of the module, keep a track of it (all the import positions
449451
# of the module will be compared to the position of this first
@@ -474,6 +476,8 @@ def compute_first_non_import_node(self, node):
474476
compute_first_non_import_node
475477

476478
def visit_functiondef(self, node):
479+
if not self.linter.is_message_enabled('wrong-import-position', node.fromlineno):
480+
return
477481
# If it is the first non import instruction of the module, record it.
478482
if self._first_non_import_node:
479483
return
@@ -560,8 +564,8 @@ def _check_imports_order(self, _module_node):
560564
extern_imports = []
561565
local_imports = []
562566
std_imports = []
563-
extern_not_nested = []
564-
local_not_nested = []
567+
extern_not_ignored = []
568+
local_not_ignored = []
565569
isort_obj = isort.SortImports(
566570
file_contents='', known_third_party=self.config.known_third_party,
567571
known_standard_library=self.config.known_standard_library,
@@ -572,10 +576,12 @@ def _check_imports_order(self, _module_node):
572576
else:
573577
package = modname.split('.')[0]
574578
nested = not isinstance(node.parent, astroid.Module)
579+
ignore_for_import_order = not self.linter.is_message_enabled('wrong-import-order',
580+
node.fromlineno)
575581
import_category = isort_obj.place_module(package)
576582
if import_category in ('FUTURE', 'STDLIB'):
577583
std_imports.append((node, package))
578-
wrong_import = extern_not_nested or local_not_nested
584+
wrong_import = extern_not_ignored or local_not_ignored
579585
if self._is_fallback_import(node, wrong_import):
580586
continue
581587
if wrong_import and not nested:
@@ -584,17 +590,17 @@ def _check_imports_order(self, _module_node):
584590
'"%s"' % wrong_import[0][0].as_string()))
585591
elif import_category in ('FIRSTPARTY', 'THIRDPARTY'):
586592
extern_imports.append((node, package))
587-
if not nested:
588-
extern_not_nested.append((node, package))
589-
wrong_import = local_not_nested
593+
if not nested and not ignore_for_import_order:
594+
extern_not_ignored.append((node, package))
595+
wrong_import = local_not_ignored
590596
if wrong_import and not nested:
591597
self.add_message('wrong-import-order', node=node,
592598
args=('external import "%s"' % node.as_string(),
593599
'"%s"' % wrong_import[0][0].as_string()))
594600
elif import_category == 'LOCALFOLDER':
595601
local_imports.append((node, package))
596-
if not nested:
597-
local_not_nested.append((node, package))
602+
if not nested and not ignore_for_import_order:
603+
local_not_ignored.append((node, package))
598604
return std_imports, extern_imports, local_imports
599605

600606
def _get_imported_module(self, importnode, modname):
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
"""Checks that disabling 'wrong-import-order' on an import prevents subsequent
2+
imports from being considered out-of-order in respect to it but does not prevent
3+
it from being considered for 'ungrouped-imports'."""
4+
# pylint: disable=unused-import,import-error,no-name-in-module
5+
6+
from first_party.foo import bar # pylint: disable=wrong-import-order
7+
import logging
8+
import os.path
9+
import sys
10+
from astroid import are_exclusive
11+
import first_party # [ungrouped-imports]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ungrouped-imports:11::Imports from package first_party are not grouped
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"""Checks that disabling 'wrong-import-position' on a statement prevents it from
2+
invalidating subsequent imports."""
3+
# pylint: disable=unused-import
4+
5+
CONSTANT = True # pylint: disable=wrong-import-position
6+
7+
import sys

0 commit comments

Comments
 (0)