summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Marek <tmarek@google.com>2012-05-15 14:51:17 +0200
committerTorsten Marek <tmarek@google.com>2012-05-15 14:51:17 +0200
commitee8ca327141be4000cd3c654eb9e710671760be9 (patch)
treefd8d2f822798b929f4a0b6fd7b1c531952cdfb8e
parent1a481908c8a45588cb65f4f8f49f576505c7b022 (diff)
downloadpylint-git-ee8ca327141be4000cd3c654eb9e710671760be9.tar.gz
Emit W0102 (dangerous default value) when sets are used as default arguments for functions. Closes #92911
-rw-r--r--ChangeLog3
-rw-r--r--checkers/base.py6
-rw-r--r--test/input/func_dangerous_default.py15
-rw-r--r--test/messages/func_dangerous_default.txt2
4 files changed, 26 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index b75206f81..68c6d0433 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,9 @@ ChangeLog for PyLint
--
+ * Emit W0102 when sets are used as default arguments in functions
+ (patch by tmarek@google.com)
+
* #77982 Do not emit E0602 for loop variables of comprehensions
used as argument values inside a decorator (patch by tmarek@google.com)
diff --git a/checkers/base.py b/checkers/base.py
index c551a3576..5de570ff1 100644
--- a/checkers/base.py
+++ b/checkers/base.py
@@ -428,6 +428,12 @@ functions, methods
else:
msg = '%s (%s)' % (default.as_string(), value.as_string())
self.add_message('W0102', node=node, args=(msg,))
+ if value.qname() == '__builtin__.set':
+ if isinstance(default, astng.CallFunc):
+ msg = default.as_string()
+ else:
+ msg = '%s (%s)' % (default.as_string(), value.qname())
+ self.add_message('W0102', node=node, args=(msg,))
@check_messages('W0101', 'W0150')
def visit_return(self, node):
diff --git a/test/input/func_dangerous_default.py b/test/input/func_dangerous_default.py
index 0bf87278c..8a526e2eb 100644
--- a/test/input/func_dangerous_default.py
+++ b/test/input/func_dangerous_default.py
@@ -15,3 +15,18 @@ def function2(value = HEHE):
def function3(value):
"""docstring"""
print value
+
+def function4(value = set()):
+ """set is mutable and dangerous."""
+ print value
+
+def function5(value = frozenset()):
+ """frozenset is immutable and safe."""
+ print value
+
+GLOBAL_SET = set()
+
+def function6(value = GLOBAL_SET):
+ """set is mutable and dangerous."""
+ print value
+
diff --git a/test/messages/func_dangerous_default.txt b/test/messages/func_dangerous_default.txt
index 21d32e022..b8828443a 100644
--- a/test/messages/func_dangerous_default.txt
+++ b/test/messages/func_dangerous_default.txt
@@ -1,2 +1,4 @@
W: 7:function1: Dangerous default value [] as argument
W: 11:function2: Dangerous default value HEHE ({}) as argument
+W: 19:function4: Dangerous default value set() as argument
+W: 29:function6: Dangerous default value GLOBAL_SET (__builtin__.set) as argument