summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcarlio <bitbucket@carlcrowder.com>2014-07-29 07:13:17 +0200
committercarlio <bitbucket@carlcrowder.com>2014-07-29 07:13:17 +0200
commit2ae896d8470d6d9b14e6a8d54564d55b99279222 (patch)
tree9512ab651c4d898e1ff45758624c9e35aecd77c2
parentbe5921dd65f379f2dbdbd0f32d546bde9d517403 (diff)
parenta4e38ceb7d2591226140c424b5f0ee7fbbd82014 (diff)
downloadpylint-2ae896d8470d6d9b14e6a8d54564d55b99279222.tar.gz
Merged logilab/pylint into default
-rw-r--r--checkers/base.py20
-rw-r--r--test/input/func_dangerous_default.py25
-rw-r--r--test/messages/func_dangerous_default.txt5
-rw-r--r--test/messages/func_dangerous_default_py30.txt5
-rw-r--r--test/messages/func_set_literal_as_default_py27.txt2
5 files changed, 52 insertions, 5 deletions
diff --git a/checkers/base.py b/checkers/base.py
index c1600b5..aaafaa2 100644
--- a/checkers/base.py
+++ b/checkers/base.py
@@ -646,14 +646,26 @@ functions, methods
except astroid.InferenceError:
continue
builtins = astroid.bases.BUILTINS
+ builtin_symbols = dict(
+ zip(['.'.join([builtins, x]) for x in ('set', 'dict', 'list')],
+ ['set()', '{}', '[]'])
+ )
+
if (isinstance(value, astroid.Instance) and
- value.qname() in ['.'.join([builtins, x]) for x in ('set', 'dict', 'list')]):
+ value.qname() in builtin_symbols.keys()):
if value is default:
- msg = default.as_string()
+ msg = builtin_symbols[value.qname()]
elif type(value) is astroid.Instance:
- msg = '%s (%s)' % (default.as_string(), value.qname())
+ if isinstance(default, astroid.CallFunc):
+ # this argument is direct call to list() or dict() etc
+ msg = '%s() (%s)' % (value.name, value.qname())
+ else:
+ # this argument is a variable from somewhere else which turns
+ # out to be a list or dict
+ msg = '%s (%s)' % (default.name, value.qname())
else:
- msg = '%s (%s)' % (default.as_string(), value.as_string())
+ # this argument is a name
+ msg = '%s (%s)' % (default.name, builtin_symbols[value.qname()])
self.add_message('dangerous-default-value', node=node, args=(msg,))
@check_messages('unreachable', 'lost-exception')
diff --git a/test/input/func_dangerous_default.py b/test/input/func_dangerous_default.py
index 3e07415..8bf2c3f 100644
--- a/test/input/func_dangerous_default.py
+++ b/test/input/func_dangerous_default.py
@@ -37,3 +37,28 @@ def function7(value=dict()):
def function8(value=list()):
"""list is mutable and dangerous."""
print value
+
+def function9(value=[1, 2, 3, 4]):
+ """list with items should not output item values in error message"""
+ print value
+
+def function10(value={'a': 1, 'b': 2}):
+ """dictionaries with items should not output item values in error message"""
+ print value
+
+def function11(value=list([1, 2, 3])):
+ """list with items should not output item values in error message"""
+ print value
+
+def function12(value=dict([('a', 1), ('b', 2)])):
+ """dictionaries with items should not output item values in error message"""
+ print value
+
+OINK = {
+ 'a': 1,
+ 'b': 2
+}
+
+def function13(value=OINK):
+ """dictionaries with items should not output item values in error message"""
+ print value
diff --git a/test/messages/func_dangerous_default.txt b/test/messages/func_dangerous_default.txt
index 6846c07..ddf94f4 100644
--- a/test/messages/func_dangerous_default.txt
+++ b/test/messages/func_dangerous_default.txt
@@ -4,3 +4,8 @@ W: 19:function4: Dangerous default value set() (__builtin__.set) as argument
W: 29:function6: Dangerous default value GLOBAL_SET (__builtin__.set) as argument
W: 33:function7: Dangerous default value dict() (__builtin__.dict) as argument
W: 37:function8: Dangerous default value list() (__builtin__.list) as argument
+W: 41:function9: Dangerous default value [] as argument
+W: 45:function10: Dangerous default value {} as argument
+W: 49:function11: Dangerous default value list() (__builtin__.list) as argument
+W: 53:function12: Dangerous default value dict() (__builtin__.dict) as argument
+W: 62:function13: Dangerous default value OINK ({}) as argument
diff --git a/test/messages/func_dangerous_default_py30.txt b/test/messages/func_dangerous_default_py30.txt
index b068149..1a6dbf0 100644
--- a/test/messages/func_dangerous_default_py30.txt
+++ b/test/messages/func_dangerous_default_py30.txt
@@ -4,3 +4,8 @@ W: 19:function4: Dangerous default value set() (builtins.set) as argument
W: 29:function6: Dangerous default value GLOBAL_SET (builtins.set) as argument
W: 33:function7: Dangerous default value dict() (builtins.dict) as argument
W: 37:function8: Dangerous default value list() (builtins.list) as argument
+W: 41:function9: Dangerous default value [] as argument
+W: 45:function10: Dangerous default value {} as argument
+W: 49:function11: Dangerous default value list() (builtins.list) as argument
+W: 53:function12: Dangerous default value dict() (builtins.dict) as argument
+W: 62:function13: Dangerous default value OINK ({}) as argument
diff --git a/test/messages/func_set_literal_as_default_py27.txt b/test/messages/func_set_literal_as_default_py27.txt
index 6a7a893..ba38ec4 100644
--- a/test/messages/func_set_literal_as_default_py27.txt
+++ b/test/messages/func_set_literal_as_default_py27.txt
@@ -1 +1 @@
-W: 5:function1: Dangerous default value {1} as argument
+W: 5:function1: Dangerous default value set() as argument