summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2015-11-26 12:43:31 +0200
committerClaudiu Popa <pcmanticore@gmail.com>2015-11-26 12:43:31 +0200
commit0b4bcb2a8b3d2aa1c90b7369f727532237e153c5 (patch)
tree1d1a0126b2eca5ac2c7188e2cdef267bb87f044a
parent508befc5aefe6ffc5ea522455f744069efa1559f (diff)
downloadpylint-0b4bcb2a8b3d2aa1c90b7369f727532237e153c5.tar.gz
Simplify the protocol methods, by using a common function.
-rw-r--r--pylint/checkers/utils.py53
1 files changed, 12 insertions, 41 deletions
diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py
index 035e591..e24a034 100644
--- a/pylint/checkers/utils.py
+++ b/pylint/checkers/utils.py
@@ -642,68 +642,39 @@ def is_inside_abstract_class(node):
return False
-def is_iterable(value):
+def _supports_protocol(value, protocol_callback):
if isinstance(value, astroid.ClassDef):
if not has_known_bases(value):
return True
# classobj can only be iterable if it has an iterable metaclass
meta = value.metaclass()
if meta is not None:
- if _supports_iteration_protocol(meta):
+ if protocol_callback(meta):
return True
if isinstance(value, astroid.Instance):
if not has_known_bases(value):
return True
- if _supports_iteration_protocol(value):
+ if protocol_callback(value):
return True
return False
+def is_iterable(value):
+ return _supports_protocol(value, _supports_iteration_protocol)
+
+
def is_mapping(value):
- if isinstance(value, astroid.ClassDef):
- if not has_known_bases(value):
- return True
- # classobj can only be a mapping if it has a metaclass is mapping
- meta = value.metaclass()
- if meta is not None:
- if _supports_mapping_protocol(meta):
- return True
- if isinstance(value, astroid.Instance):
- if not has_known_bases(value):
- return True
- if _supports_mapping_protocol(value):
- return True
- return False
+ return _supports_protocol(value, _supports_mapping_protocol)
def supports_membership_test(value):
- if isinstance(value, astroid.ClassDef):
- if not has_known_bases(value):
- return True
- meta = value.metaclass()
- if meta is not None and _supports_membership_test_protocol(meta):
- return True
- if isinstance(value, astroid.Instance):
- if not has_known_bases(value):
- return True
- if _supports_membership_test_protocol(value):
- return True
- return is_iterable(value)
+ supported = _supports_protocol(value, _supports_membership_test_protocol)
+ return supported or is_iterable(value)
def supports_subscript(value):
- if isinstance(value, astroid.ClassDef):
- if not has_known_bases(value):
- return False
- meta = value.metaclass()
- if meta is not None and _supports_subscript_protocol(meta):
- return True
- if isinstance(value, astroid.Instance):
- if not has_known_bases(value):
- return True
- if _supports_subscript_protocol(value):
- return True
- return False
+ return _supports_protocol(value, _supports_subscript_protocol)
+
# TODO(cpopa): deprecate these or leave them as aliases?
def safe_infer(node, context=None):