Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py

changeset 5621
80cce672d505
parent 5619
ab999dc48132
child 5639
9ee960bceb51
diff -r 6bca68319bb4 -r 80cce672d505 Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py
--- 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):

eric ide

mercurial