Duck Typing in Python – 3 praktiske eksempler

praktiske eksempler

i Python giver iteration os mulighed for at gå over en liste over emner til at udføre bestemte operationer. En almindelig måde at oprette en iteration på er at bruge for sløjferne, som har følgende generelle format.

for i in iterable:
expression

som diskuteret i min tidligere artikel kan vi oprette vores brugerdefinerede iteratorer, der kan bruges som iterables i for loops. For at tilfredsstille “duck testing” for iteratorer skal den brugerdefinerede klasse implementere __iter__() og __next__() metoderne. Et specifikt eksempel er angivet nedenfor.

Duck Typing I iteratorer

i ovenstående kodestykke implementerede vi både __iter__() og __next__() metoder, der gør forekomsterne af den brugerdefinerede klasse Cubes iteratorer, således at forekomsten kunne bruges i en for loop.

Callables

udover den indbyggede dict datatype er en anden vigtig ordbogstype defaultdict, tilgængelig i collections modulet. Denne ordbog-lignende datatype har følgende konstruktør: defaultdict(]). Specifikt er argumentet default_factory en type, der kan kaldes, såsom en funktion eller lambda-funktion.

i min tidligere artikel viste jeg, at vi kunne udnytte defaultdict ved at passere en lambda-funktion. Her er eksemplet på dets brug.

>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()

især kan vi have bedre fleksibilitet til at bruge datatypen defaultdict, hvis vi opretter vores egen standardfabrik. Med filosofien “duck typing” skal den brugerdefinerede klasse implementere __call__() – metoden, som er at gøre noget, der kan kaldes. Lad os se, hvordan det virker.

Duck Typing in Callables

som vist i ovenstående kode opretter vi klassen DucklingFactory, hvis __call__() funktion returnerer en liste over en Duckling forekomst. Ved hjælp af denne fabriksfunktion kan vi lave det ønskede antal ænder ved at multiplicere standard duckling-listen.

sortering med Len ()

en anden mulig anvendelse af ændertypning er at implementere den brugerdefinerede len() – funktion, som kan bruges til at sortere en liste ved hjælp af funktionen sort(). Som en sidebemærkning henviser nogle mennesker til len() – funktionen som en magisk funktion, fordi den implementeres ved at kalde __len__() – funktionen bag scenen (disse funktioner med dobbelt understregninger som præfiks og suffiks kaldes magiske funktioner).

Antag, at vi vil sortere en liste over ænder baseret på længden af navnet på hver And. Sådan kan vi anvende ændertypningen i dette tilfælde.

Ændertypning i sortering

i ovenstående kodestykke implementerer den brugerdefinerede NamedDuck – klasse funktionerne __str__() og __len__(), som gør det muligt for os at bruge funktionerne str() og len() på dens forekomster i henholdsvis linje 10 og 12. Det er vigtigt, som du kan se, selvom listen er blandet med navngivne ænder og strenge, kan alle elementer kalde funktionerne str() og len(), således at listen kan sorteres ved hjælp af len() som nøglen og bruges i listeforståelsen, når vi vil udskrive det sorterede resultat.

den bredere implikation af denne brug er således, at når vi har en blandet liste over elementer af forskellige datatyper, så længe hver datatype implementerer de samme funktioner, vil elementerne bestå ændertesten og blive anvendt med de korrekte operationer. Her er et eksempel på generel brug ved hjælp af funktionen len() på en blandet liste over datatyper str, tuple og list.

>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']

You might also like

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.