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):