python setdefault(key,set())).update(... возвращает None

У меня проблема с setdefault и профсоюзами, которые не работают так, как я ожидаю. Мой код выглядит так:



    #!/usr/bin/python3.3
    kanjidic = {
        '恕': {'radical':{'multi_radical': {'口心女'}}},
        '靛': {'radical':{'multi_radical': {'亠宀月疋二青土'}}},
    }
    k_rad = {}
    for k,v in kanjidic.items():
        if 'radical' in v and 'multi_radical' in v['radical']:
            print (k, set(v['radical']['multi_radical']))
            k_rad[k] = k_rad.setdefault(k, set()).update(
                set(v['radical']['multi_radical']))
        print('>>', k_rad[k])

Вывод на печать выглядит так:

    恕 {'口 心 女'}
    >> Нет
    靛 {'亠宀月疋二青土'}
    >> Нет

Если я подставлю две строки ниже для установки k_rad:



    k_rad[k] = k_rad.setdefault(k, set())
    k_rad[k].update(set(v['radical']['multi_radical']))

Мой вывод выглядит так:

    靛 {'亠宀月疋二青土'}
    >> {'亠 宀 月 疋 二 青 土'}
    恕 {'口 心 女'}
    >> {'口 心 女'}

Если я понимаю setdefault, (что, очевидно, я не понимаю), вывод должен быть одинаковым, верно? Что мне не хватает? Почему я dict.setupdate(key,set()).update(set(...)) возвращение Нет?


Как указано ниже, проблема в том, что обновление возвращает None. Я действительно не понимал, как update и setdefault работают вместе. Так как setdefault устанавливает значение dict по умолчанию, если мы создаем новый элемент dict и возвращаем хэш, а обновление обновляет элемент, назначение которого мне не нужно. Все, что мне действительно нужно было:



    for k,v in kanjidic.items():
        if 'radical' in v and 'multi_radical' in v['radical']:
            k_rad.setdefault(k, set()).update(v['radical']['multi_radical'])

Спасибо за помощь!

1 ответ

Решение

dict.setdefault возвращает набор в вашем случае. А также set.update является операцией на месте, что означает, что она изменяет исходный набор и возвращает None. Поэтому, если вы присваиваете результат переменной, вы просто присваиваете ей None.

Другие вопросы по тегам