functools.partial() și partialmethod() în Python

Modulul functools Python 3.0+ (partialmethod: 3.4+)

Creează o funcție nouă dintr-una existentă, cu unele argumente deja completate.

Sintaxă
functools.partial(functie, *args, **kwargs)
functools.partialmethod(metoda, *args, **kwargs)

Ce face functools.partial() și partialmethod()

partial(f, a, x=1) returnează o funcție care, apelată cu (b), execută f(a, b, x=1). Este utilă când o funcție trebuie dată ca parametru (de exemplu la map() sau ca funcție de apel ulterior) și vrei să fixezi unele argumente.

partialmethod() face același lucru pentru metodele unei clase, ținând cont de self.

Parametri

Parametru Descriere
functie Funcția de bază.
*args, **kwargs Argumentele fixate.

Ce returnează

Un obiect apelabil partial.

Exemple

Exemplul 1: Argumente fixate

from functools import partial
din_binar = partial(int, base=2)
print(din_binar("1010"), din_binar("1111"))

def pret_final(pret, tva, reducere=0):
    return round(pret * (1 + tva) * (1 - reducere), 2)

cu_tva_redus = partial(pret_final, tva=0.09)
print(list(map(cu_tva_redus, [10, 20, 30])))
print(cu_tva_redus.func.__name__, cu_tva_redus.keywords)

Rezultat

10 15
[10.9, 21.8, 32.7]
pret_final {'tva': 0.09}

Exemplul 2: partialmethod

from functools import partialmethod

class Lampa:
    def __init__(self):
        self.aprinsa = False
    def seteaza(self, stare):
        self.aprinsa = stare
    aprinde = partialmethod(seteaza, True)
    stinge = partialmethod(seteaza, False)

l = Lampa()
l.aprinde()
print(l.aprinsa)
l.stinge()
print(l.aprinsa)

Rezultat

True
False

Greșeli frecvente

  • Fixezi un argument pozițional care nu este primul și argumentele ajung în altă ordine decât te aștepți. Pentru claritate, fixează-le după nume.

Comenzi înrudite

  • lambda: Creează o funcție mică, fără nume, scrisă pe un singur rând.
  • map(): Aplică o funcție fiecărui element dintr-o colecție.
  • def: Definește o funcție: un bloc de cod cu nume, pe care îl poți apela de oricâte ori.