diff options
author | carlio <bitbucket@carlcrowder.com> | 2014-07-29 07:13:17 +0200 |
---|---|---|
committer | carlio <bitbucket@carlcrowder.com> | 2014-07-29 07:13:17 +0200 |
commit | 2ae896d8470d6d9b14e6a8d54564d55b99279222 (patch) | |
tree | 9512ab651c4d898e1ff45758624c9e35aecd77c2 | |
parent | be5921dd65f379f2dbdbd0f32d546bde9d517403 (diff) | |
parent | a4e38ceb7d2591226140c424b5f0ee7fbbd82014 (diff) | |
download | pylint-2ae896d8470d6d9b14e6a8d54564d55b99279222.tar.gz |
Merged logilab/pylint into default
-rw-r--r-- | checkers/base.py | 20 | ||||
-rw-r--r-- | test/input/func_dangerous_default.py | 25 | ||||
-rw-r--r-- | test/messages/func_dangerous_default.txt | 5 | ||||
-rw-r--r-- | test/messages/func_dangerous_default_py30.txt | 5 | ||||
-rw-r--r-- | test/messages/func_set_literal_as_default_py27.txt | 2 |
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 |