Zoeken…


Invoering

Zoals je waarschijnlijk weet als je van de OOP-school kwam, is het een praktijk die je in gedachten moet houden bij het schrijven van je code.

Wat als u een abstracte functie zou kunnen definiëren en specialiseren om er verschillende versies van te maken? Beschouwt het als een soort functie-overerving waarbij u specifieke params bindt om ze betrouwbaar te maken voor een specifiek scenario.

Syntaxis

  • gedeeltelijke (functie, ** params_you_want_fix)

parameters

Param gegevens
X het te verhogen aantal
Y de exponent
raise de te specialiseren functie

Opmerkingen

Zoals vermeld in Python doc the functools.partial :

Retourneer een nieuw gedeeltelijk object dat zich, wanneer het wordt aangeroepen, zal gedragen als func dat wordt aangeroepen met de positionele argumenten args en sleutelwoorden voor trefwoordargumenten. Als er meer argumenten aan de oproep worden toegevoegd, worden deze aan args toegevoegd. Als er aanvullende trefwoordargumenten worden verstrekt, worden deze uitgebreid en vervangen.

Controleer deze link om te zien hoe gedeeltelijk kan worden geïmplementeerd.

Verhoog de kracht

Laten we aannemen dat we x tot een getal y willen verhogen.

Je zou dit schrijven als:

def raise_power(x, y):
    return x**y

Wat als uw y- waarde een eindige reeks waarden kan aannemen?

Laten we aannemen dat y een van [3,4,5] kan zijn en laten we zeggen dat u de eindgebruiker niet de mogelijkheid wilt bieden om een dergelijke functie te gebruiken, omdat deze zeer rekenintensief is. In feite zou u controleren of y een geldige waarde aanneemt en uw functie herschrijven als:

def raise(x, y):
    if y in (3,4,5):
        return x**y
    raise NumberNotInRangeException("You should provide a valid exponent")

Rommelig? Laten we de abstracte vorm gebruiken en specialiseren in alle drie de gevallen: laten we ze gedeeltelijk implementeren.

from functors import partial
raise_to_three = partial(raise, y=3)
raise_to_four = partial(raise, y=4)
raise_to_five = partial(raise, y=5)

Wat gebeurt hier? We hebben de y- params opgelost en we hebben drie verschillende functies gedefinieerd.

U hoeft de hierboven gedefinieerde abstracte functie niet te gebruiken (u kunt deze privé maken ), maar u kunt gedeeltelijk toegepaste functies gebruiken om een getal tot een vaste waarde te verhogen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow