diff options
author | Claudiu Popa <pcmanticore@gmail.com> | 2015-11-26 12:43:31 +0200 |
---|---|---|
committer | Claudiu Popa <pcmanticore@gmail.com> | 2015-11-26 12:43:31 +0200 |
commit | 0b4bcb2a8b3d2aa1c90b7369f727532237e153c5 (patch) | |
tree | 1d1a0126b2eca5ac2c7188e2cdef267bb87f044a /pylint | |
parent | 508befc5aefe6ffc5ea522455f744069efa1559f (diff) | |
download | pylint-0b4bcb2a8b3d2aa1c90b7369f727532237e153c5.tar.gz |
Simplify the protocol methods, by using a common function.
Diffstat (limited to 'pylint')
-rw-r--r-- | pylint/checkers/utils.py | 53 |
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): |