2016-11-21 4 views
0

У меня есть код, который работал в python 2, но теперь в python 3 возникает ошибка «TypeError: аргументы ключевого слова должны быть строками». Это первая строка функции, поэтому не должно быть проблем с предыдущим кодом.Python 3 defaultdict with lambda expression

map = collections.defaultdict(lambda: 'blinn',**{0: 'constant', 1:'lambert'}) 

Возможно, кто-то может также объяснить мне, что делает эта строка кода, и что такое создаваемый объект «map». Я нашел Python defaultdict and lambda, но у меня все еще есть проблемы с пониманием этой строки кода.

+0

'map' является' defaultdict'. если вы используете '**', тогда ключи должны быть строками - '" 0 "и" 1 ". – furas

ответ

2

**{0: 'constant', 1:'lambert'} передает в две пары ключ-значение по умолчанию в качестве аргументов ключевого слова в конструктор defaultdict(). Однако тот же конструктор будет рассматривать словарь как второй аргумент как значение по умолчанию.

Таким образом, ** может вообще отсутствовать, как в 2 и 3:

collections.defaultdict(lambda: 'blinn', {0: 'constant', 1:'lambert'}) 

Demo в Python 2, изображающее вы получите тот же результат:

>>> import sys 
>>> sys.version_info 
sys.version_info(major=2, minor=7, micro=12, releaselevel='final', serial=0) 
>>> import collections 
>>> collections.defaultdict(lambda: 'blinn', **{0: 'constant', 1:'lambert'}) == collections.defaultdict(lambda: 'blinn', {0: 'constant', 1:'lambert'}) 
True 
>>> collections.defaultdict(lambda: 'blinn', **{0: 'constant', 1:'lambert'}) 
defaultdict(<function <lambda> at 0x102426410>, {0: 'constant', 1: 'lambert'}) 
>>> _[0] 
'constant' 
>>> collections.defaultdict(lambda: 'blinn', {0: 'constant', 1:'lambert'}) 
defaultdict(<function <lambda> at 0x102426410>, {0: 'constant', 1: 'lambert'}) 
>>> _[0] 
'constant' 

и в Python 3 :

>>> import sys 
>>> sys.version_info 
sys.version_info(major=3, minor=6, micro=0, releaselevel='beta', serial=3) 
>>> import collections 
>>> collections.defaultdict(lambda: 'blinn', {0: 'constant', 1:'lambert'}) 
defaultdict(<function <lambda> at 0x10e3589d8>, {0: 'constant', 1: 'lambert'}) 
>>> _[0] 
'constant' 
+0

Почему defaultdict принимает не строковые аргументы ключевого слова? Разве это не нарушает согласованность? – grzgrzgrz3

+0

@ аргументы ключевого слова grzgrzgrz3 всегда являются строками, но Python 2 не применял это при использовании '** kw'. В вызове * и * вызываемый может принимать произвольные аргументы ключевых слов. Python 3 исправил это. –

+0

Как я вижу в python2, он применяется только к объектам на основе dict. Другие объекты, вызывающие «TypeError». – grzgrzgrz3