# Path: wxpy/utils/misc.py
# def match_attributes(obj, **attributes):
#     """
#     判断对象是否匹配输入的属性条件
# 
#     :param obj: 对象
#     :param attributes: 属性键值对
#     :return: 若匹配则为 True，否则为 False
#     """
# 
#     has_raw = hasattr(obj, 'raw')
# 
#     for attr, value in attributes.items():
#         if (getattr(obj, attr, None) or (obj.raw.get(attr) if has_raw else None)) != value:
#             return False
#     return True
# 
# def match_name(chat, keywords):
#     """
#     判断一个 Chat 对象的名称是否包含了所有的关键词 (不区分大小写)
# 
#     :param chat: Chat 对象
#     :param keywords: 关键词，可以是空白分割的 str，或是多个精准关键词组成的 list
#     :return: 若包含了所有的关键词则为 True，否则为 False
#     """
#     keywords = prepare_keywords(keywords)
# 
#     for kw in keywords:
#         for attr in 'remark_name', 'display_name', 'nick_name', 'wxid':
#             if kw in '{0}'.format(getattr(chat, attr, '')).lower():
#                 break
#         else:
#             return False
#     return True


import logging
import time
from collections import Counter
from wxpy.utils import match_attributes, match_name
from wxpy.compatible import *
        from wxpy.utils import ensure_list
        from .group import Group
        from wxpy.api.consts import FEMALE
        from wxpy.api.consts import MALE
        from wxpy.api.bot import Bot
class Chats(list):
    """
    多个聊天对象的合集，可用于搜索或统计
    """

    def __init__(self, chat_list=None, source=None):
        if chat_list:
            super(Chats, self).__init__(chat_list)
        self.source = source

    def __add__(self, other):
        return Chats(super(Chats, self).__add__(other or list()))

    def search(self, keywords=None, **attributes):
        """
        在聊天对象合集中进行搜索
        
        ..  note:: 
    
            | 搜索结果为一个 :class:`Chats (列表) <Chats>` 对象
            | 建议搭配 :any:`ensure_one()` 使用

        :param keywords: 聊天对象的名称关键词
        :param attributes: 属性键值对，键可以是 sex(性别), province(省份), city(城市) 等。例如可指定 province='广东'
        :return: 匹配的聊天对象合集
        :rtype: :class:`wxpy.Chats`
        """

        def match(chat):


# Path: wxpy/utils/misc.py
# def match_attributes(obj, **attributes):
#     """
#     判断对象是否匹配输入的属性条件
# 
#     :param obj: 对象
#     :param attributes: 属性键值对
#     :return: 若匹配则为 True，否则为 False
#     """
# 
#     has_raw = hasattr(obj, 'raw')
# 
#     for attr, value in attributes.items():
#         if (getattr(obj, attr, None) or (obj.raw.get(attr) if has_raw else None)) != value:
#             return False
#     return True
# 
# def match_name(chat, keywords):
#     """
#     判断一个 Chat 对象的名称是否包含了所有的关键词 (不区分大小写)
# 
#     :param chat: Chat 对象
#     :param keywords: 关键词，可以是空白分割的 str，或是多个精准关键词组成的 list
#     :return: 若包含了所有的关键词则为 True，否则为 False
#     """
#     keywords = prepare_keywords(keywords)
# 
#     for kw in keywords:
#         for attr in 'remark_name', 'display_name', 'nick_name', 'wxid':
#             if kw in '{0}'.format(getattr(chat, attr, '')).lower():
#                 break
#         else:
#             return False
#     return True


# Path: wxpy/api/chats/chats.py
import logging
import time
from collections import Counter
from wxpy.utils import match_attributes, match_name
from wxpy.compatible import *
        from wxpy.utils import ensure_list
        from .group import Group
        from wxpy.api.consts import FEMALE
        from wxpy.api.consts import MALE
        from wxpy.api.bot import Bot

class Chats(list):
    """
    多个聊天对象的合集，可用于搜索或统计
    """

    def __init__(self, chat_list=None, source=None):
        if chat_list:
            super(Chats, self).__init__(chat_list)
        self.source = source

    def __add__(self, other):
        return Chats(super(Chats, self).__add__(other or list()))

    def search(self, keywords=None, **attributes):
        """
        在聊天对象合集中进行搜索
        
        ..  note:: 
    
            | 搜索结果为一个 :class:`Chats (列表) <Chats>` 对象
            | 建议搭配 :any:`ensure_one()` 使用

        :param keywords: 聊天对象的名称关键词
        :param attributes: 属性键值对，键可以是 sex(性别), province(省份), city(城市) 等。例如可指定 province='广东'
        :return: 匹配的聊天对象合集
        :rtype: :class:`wxpy.Chats`
        """

        def match(chat):


            if not match_name(chat, keywords):