Python Language
Partiella funktioner
Sök…
Introduktion
Som du förmodligen vet om du kom från OOP-skolan, specialiserad på en abstrakt klass och använda det är en praxis du bör tänka på när du skriver din kod.
Tänk om du skulle kunna definiera en abstrakt funktion och specialisera den för att skapa olika versioner av den? Tänker det som en slags funktion Arv där du binder specifika paramer för att göra dem tillförlitliga för ett specifikt scenario.
Syntax
- partiell (funktion, ** params_you_want_fix)
parametrar
Param | detaljer |
---|---|
x | antalet som ska höjas |
y | exponenten |
höja | funktionen som ska specialiseras |
Anmärkningar
Som det framgår av Python doc doc functools.partial :
Returnera ett nytt partiellt objekt som när det anropas kommer att uppträda som func som heter med positioneringsargument args och nyckelord argument nyckelord. Om fler argument tillförs samtalet läggs de till args. Om ytterligare sökordargument tillhandahålls utvidgar och åsidosätter de sökord.
Kontrollera den här länken för att se hur delvis kan implementeras.
Höj kraften
Låt oss anta att vi vill höja x till ett nummer y .
Du skulle skriva detta som:
def raise_power(x, y):
return x**y
Tänk om ditt y- värde kan anta en ändlig uppsättning värden?
Låt oss anta att y kan vara en av [3,4,5] och låt oss säga att du inte vill erbjuda slutanvändaren möjlighet att använda en sådan funktion eftersom den är mycket beräkningsintensiv. I själva verket skulle du kontrollera om förutsatt att y antar ett giltigt värde och skriv om din funktion som:
def raise(x, y):
if y in (3,4,5):
return x**y
raise NumberNotInRangeException("You should provide a valid exponent")
Rörig? Låt oss använda den abstrakta formen och specialiserar den i alla tre fall: låt oss implementera dem delvis .
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)
Vad händer här? Vi fixade y- paramerna och vi definierade tre olika funktioner.
Du behöver inte använda den abstrakta funktionen som definierats ovan (du kan göra den privat ) men du kan använda delvis tillämpade funktioner för att hantera att höja ett nummer till ett fast värde.