Added a checker for using mutable types as default functiona rgument (M821).

Fri, 17 Mar 2017 19:19:19 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 17 Mar 2017 19:19:19 +0100
changeset 5621
80cce672d505
parent 5620
6bca68319bb4
child 5622
c4806baecec6

Added a checker for using mutable types as default functiona rgument (M821).

Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.py file | annotate | diff | comparison | revisions
Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py file | annotate | diff | comparison | revisions
Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py file | annotate | diff | comparison | revisions
Plugins/CheckerPlugins/CodeStyleChecker/translations.py file | annotate | diff | comparison | revisions
--- a/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.py	Fri Mar 17 19:10:39 2017 +0100
+++ b/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.py	Fri Mar 17 19:19:19 2017 +0100
@@ -15,7 +15,7 @@
     Ui_CodeStyleAddBuiltinIgnoreDialog
 
 
-class CodeStyleAddBuiltinIgnoreDialog(QDialog, 
+class CodeStyleAddBuiltinIgnoreDialog(QDialog,
                                       Ui_CodeStyleAddBuiltinIgnoreDialog):
     """
     Class implementing a dialog to enter the data for a built-in assignment to
--- a/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py	Fri Mar 17 19:10:39 2017 +0100
+++ b/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py	Fri Mar 17 19:19:19 2017 +0100
@@ -1195,13 +1195,13 @@
     @pyqtSlot()
     def on_addBuiltinButton_clicked(self):
         """
-        Slot documentation goes here.
+        Private slot to add a built-in assignment to be ignored.
         """
         from .CodeStyleAddBuiltinIgnoreDialog import \
             CodeStyleAddBuiltinIgnoreDialog
         dlg = CodeStyleAddBuiltinIgnoreDialog(self)
         if dlg.exec_() == QDialog.Accepted:
-            left,  right = dlg.getData()
+            left, right = dlg.getData()
             QTreeWidgetItem(self.builtinsAssignmentList, [left, right])
     
     @pyqtSlot()
--- a/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Fri Mar 17 19:10:39 2017 +0100
+++ b/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Fri Mar 17 19:19:19 2017 +0100
@@ -35,6 +35,7 @@
         
         "M801",
         "M811",
+        "M821",
         
         "M901",
     ]
@@ -107,6 +108,7 @@
             (self.__checkFuture, ("M701", "M702")),
             (self.__checkPrintStatements, ("M801",)),
             (self.__checkTuple, ("M811", )),
+            (self.__checkMutableDefault, ("M821", )),
         ]
         
         self.__defaultArgs = {
@@ -586,6 +588,29 @@
                                        'sorted', 'sum', 'tuple',)):
                     self.__error(node.lineno - 1, node.col_offset, "M198",
                                  node.func.id)
+    
+    def __checkMutableDefault(self):
+        """
+        Private method to check for use of mutable types as default arguments.
+        """
+        mutableTypes = [
+            ast.Call,
+            ast.Dict,
+            ast.List,
+            ast.Set,
+        ]
+        
+        for node in ast.walk(self.__tree):
+            if isinstance(node, ast.FunctionDef):
+                for default in node.args.defaults:
+                    if any(isinstance(default, mutableType)
+                           for mutableType in mutableTypes):
+                        if sys.version_info[0] == 2:
+                            typeName = default.__name__
+                        else:
+                            typeName = type(default).__name__
+                        self.__error(node.lineno - 1, node.col_offset, "M821",
+                                     typeName)
 
 
 class TextVisitor(ast.NodeVisitor):
--- a/Plugins/CheckerPlugins/CodeStyleChecker/translations.py	Fri Mar 17 19:10:39 2017 +0100
+++ b/Plugins/CheckerPlugins/CodeStyleChecker/translations.py	Fri Mar 17 19:19:19 2017 +0100
@@ -515,6 +515,9 @@
     "M811": QCoreApplication.translate(
         "MiscellaneousChecker",
         "one element tuple found"),
+    "M821": QCoreApplication.translate(
+        "MiscellaneousChecker",
+        "mutable default argument of type {0}"),
     "M901": QCoreApplication.translate(
         "MiscellaneousChecker",
         "{0}: {1}"),
@@ -706,6 +709,7 @@
     "M632": ["foo"],
     "M701": ["print_function, unicode_literals", "print_function"],
     "M702": ["print_function, unicode_literals"],
+    "M821": ["Dict"],
     "M901": ["SyntaxError", "Invalid Syntax"],
     "FWRITE_ERROR": ["IOError"],
 }

eric ide

mercurial