Duck Typing in Python – 3 Practical Examples

Practical Examples

in Python stelt iteratie ons in staat om een lijst met items door te nemen om bepaalde bewerkingen uit te voeren. Een veelgebruikte manier om een iteratie aan te maken is het gebruik van de for loops, die het volgende algemene formaat hebben.

for i in iterable:
expression

zoals besproken in mijn vorige artikel, kunnen we onze aangepaste iterators maken die gebruikt kunnen worden als iterables in de loops for. Om te voldoen aan de” duck testing ” voor iterators, moet de aangepaste klasse de __iter__() en __next__() methoden implementeren. Hieronder volgt een specifiek voorbeeld.

Duck Typing in Iterators

in het bovenstaande codefragment hebben we zowel __iter__() als __next__() methoden geïmplementeerd die de instanties van de aangepaste klasse Cubes iterators maken, zodat de instantie kon worden gebruikt in een for lus.

Callables

naast het ingebouwde dict gegevenstype is een ander belangrijk woordenboektype defaultdict, beschikbaar in de collections module. Dit dictionary-achtige gegevenstype heeft de volgende constructor: defaultdict(]). Het default_factory argument is een type callable, zoals een functie of lambda functie.

In mijn vorige artikel liet ik zien dat we de defaultdict konden gebruiken door een lambda-functie over te geven. Hier is het voorbeeld van het gebruik ervan.

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

met name kunnen we meer flexibiliteit hebben om het defaultdict gegevenstype te gebruiken als we onze eigen standaardfabriek maken. Met de” duck typing ” filosofie moet de custom class de __call__() methode implementeren, namelijk iets opvraagbaar maken. Eens kijken hoe het werkt.

Duck Typen in Callables

zoals weergegeven in de bovenstaande code, maken we de klasse DucklingFactory, waarvan de functie __call__() een lijst van één Duckling instantie retourneert. Met behulp van deze fabrieksfunctie kunnen we het gewenste aantal eendjes maken door de standaard eendenlijst te vermenigvuldigen.

Sorteren met Len ()

een ander mogelijk gebruik van duck Typen is het implementeren van de aangepaste len() functie, die kan worden gebruikt in het sorteren van een lijst met behulp van de sort() functie. Als een kanttekening, sommige mensen verwijzen naar de len() functie als een magische functie, omdat het wordt geïmplementeerd door de __len__() functie achter de scène aan te roepen (die functies met dubbele underscores als voorvoegsel en achtervoegsel worden magische functies genoemd).

stel dat we een lijst van eenden willen Sorteren op basis van de lengte van de naam van elke eend. Hier is hoe we de eend typen kunnen toepassen in dit geval.

Duck Typing in Sorting

in het bovenstaande codefragment implementeert de aangepaste klasse NamedDuck de __str__() en __len__() functies, die ons in staat stellen om de str() en len() functies op zijn instanties te gebruiken in respectievelijk de regels 10 en 12. Belangrijk, zoals je kunt zien, hoewel de lijst gemengd is met named ducks en strings, kunnen alle elementen de str() en len() functies aanroepen, zodat de lijst gesorteerd kan worden met behulp van de len() als de sleutel en gebruikt kan worden in het lijstbegrip wanneer we het gesorteerde resultaat willen afdrukken.

de bredere implicatie van dit gebruik is dat wanneer we een gemengde lijst van elementen van verschillende gegevenstypen hebben, zolang elk gegevenstype dezelfde functies implementeert, de elementen de duck-Test doorstaan en met de juiste bewerkingen worden toegepast. Hier is een algemeen voorbeeld met behulp van de len () functie op een gemengde lijst van gegevenstypen van str, tuple, en list.

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

You might also like

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.