is_list_like()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
c 2
b 0
f 0
dl 0
loc 22
rs 9.2
1
#
2
# Copyright (C) 2011 - 2015 Red Hat, Inc.
3
# Copyright (C) 2011 - 2017 Satoru SATOH <ssato redhat.com>
4
# License: MIT
5
#
6
"""Utility routines.
7
"""
8
from __future__ import absolute_import
9
import collections
10
import m9dicts.compat
11
12
13
_LIST_LIKE_TYPES = (collections.Iterable, collections.Sequence)
14
15
16
def is_dict_like(obj):
17
    """
18
    :param obj: Any object behaves like a dict.
19
20
    >>> is_dict_like("a string")
21
    False
22
    >>> is_dict_like({})
23
    True
24
    >>> is_dict_like(m9dicts.compat.OrderedDict((('a', 1), ('b', 2))))
25
    True
26
    """
27
    return isinstance(obj, (dict, collections.Mapping))  # any others?
28
29
30
def is_namedtuple(obj):
31
    """
32
    >>> p0 = collections.namedtuple("Point", "x y")(1, 2)
33
    >>> is_namedtuple(p0)
34
    True
35
    >>> is_namedtuple(tuple(p0))
36
    False
37
    """
38
    return isinstance(obj, tuple) and hasattr(obj, "_asdict")
39
40
41
def is_list_like(obj):
42
    """
43
    >>> is_list_like([])
44
    True
45
    >>> is_list_like(())
46
    True
47
    >>> is_list_like([x for x in range(10)])
48
    True
49
    >>> is_list_like((1, 2, 3))
50
    True
51
    >>> g = (x for x in range(10))
52
    >>> is_list_like(g)
53
    True
54
    >>> is_list_like("abc")
55
    False
56
    >>> is_list_like(0)
57
    False
58
    >>> is_list_like({})
59
    False
60
    """
61
    return isinstance(obj, _LIST_LIKE_TYPES) and \
62
        not (isinstance(obj, m9dicts.compat.STR_TYPES) or is_dict_like(obj))
63
64
# vim:sw=4:ts=4:et:
65