Fri, 17 Mar 2017 19:19:19 +0100
Added a checker for using mutable types as default functiona rgument (M821).
--- 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"], }