Понимание списка с частичным совпадением строк - PullRequest
0 голосов
/ 10 декабря 2018

Попытка написать функцию для поиска ответа на запрос, преобразованного в список словарей.У каждого возвращенного пользователя будет много атрибутов, но мне нужно найти пользователей по display_name на основе запроса, переданного через основную функцию.

В настоящее время выдается ошибка:

, если запрос пользователя ['display_name']: TypeError: аргумент типа 'NoneType' не повторяется

Определение функции

def search_users(self, query, group='any'):
    # Returns list of dictionaries representing users
    users = self.get_all_users()

    for user in users:
        if query in user['display_name']:
            result_set.append(user)

Вызов основной функции

looker.search_users('steve')

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Казалось бы, по крайней мере одно из ваших display_name значений равно None.

Когда вы используете ключевое слово in в этом случае, вы ищете что-то in None, которое выдаетисключение.

В зависимости от того, как вы хотите обработать этот случай, вы можете проверить, существует ли значение, прежде чем пытаться добавить.

for user in users:
        if user and user['display_name'] and query in user['display_name']:  # probably extract this check into a helper
            result_set.append(user)

Я бы выделил логическую логику в отдельный метод:

def is_query_match(user, query):
    if user and user['d'] and query in user['d']:
        return True
    return False

Таким образом, вы можете использовать:

for user in users:
    if is_query_match(user, query):
        result_set.append(user)
0 голосов
/ 10 декабря 2018

просто измените строку:

if query in user['display_name']:

на

if query in user.get('display_name',''):

приведенный выше ответ не будет работать, если ключ присутствует и его значение в None, поэтому я обновил свой ответсогласно комментарию @tobias_k -

if query in (user['display_name'] or ''):
...