2016-11-21 4 views
0

Ich habe einen Code, der in Python 2 arbeitete, aber jetzt in Python 3 löst den Fehler "TypeError: Keyword-Argumente müssen Zeichenfolgen sein". Es ist die erste Zeile einer Funktion, sollte also kein Problem mit dem vorherigen Code sein.Python 3 defaultdict mit Lambda-Ausdruck

Vielleicht könnte mir jemand auch erklären, was diese Codezeile macht und was das "map" -Objekt ist, das erstellt wird. Ich habe Python defaultdict and lambda gefunden, aber ich habe immer noch Probleme, diese Codezeile zu verstehen.

+0

'map' ist' defaultdict'. Wenn Sie '**' verwenden, müssen die Schlüssel Strings sein - '" 0 "' und '" 1 "'. – furas

Antwort

2

Die **{0: 'constant', 1:'lambert'} übergibt zwei Schlüssel/Wert-Schlüsselpaare als Schlüsselwortargumente an den Konstruktor defaultdict(). Derselbe Konstruktor würde jedoch auch ein Wörterbuch als zweites Argument als Standard behandeln.

Als solches kann die ** ganz weggelassen werden, sowohl in der 2 und 3:

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

Demo in Python 2 und zeigt Ihnen die gleiche Leistung erhalten:

>>> 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' 

und in 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

Warum akzeptiert defaultdict keine String-Schlüsselwortargumente? Zerbricht es nicht die Konsistenz? – grzgrzgrz3

+0

@ grzgrzgrz3 Schlüsselwortargumente sind immer Zeichenfolgen, aber Python 2 hat dies nicht erzwungen, wenn '** kw' verwendet wurde. In einem Aufruf * und * akzeptiert das Callable beliebige Schlüsselwortargumente. Python 3 hat das behoben. –

+0

Wie ich in Python2 sehen kann, gilt es nur für Objekte, die auf dict basieren. Andere Objekte, die 'TypeError' auslösen. – grzgrzgrz3

Verwandte Themen