Funkciju pārslodze var nebūt iebūvēta Python, taču ir veidi, kā to atdarināt.

Funkciju pārslodze ir funkcija dažās programmēšanas valodās, kas ļauj definēt vienas un tās pašas funkcijas variantus. Katram variantam ir vienāds nosaukums, taču dažādas ieviešanas iespējas ar unikāliem funkciju parakstiem.

Šis paņēmiens ļauj veikt dažādas darbības, pamatojoties uz funkcijai nodoto argumentu veidu un skaitu.

Atšķirībā no tādām valodām kā C++ un Java, Python pēc noklusējuma neatbalsta funkciju pārslodzi, taču ir veidi, kā panākt līdzīgu funkcionalitāti.

Kā Python apstrādā funkciju pārslodzi?

Programmā Python vienu un to pašu funkciju var definēt vairāk nekā vienu reizi ar dažādiem parametriem, datu tipiem vai abiem katrā definīcijā. Tomēr Python atpazīs tikai pēdējo funkcijas definīciju, kad to izsaucat. Šeit ir piemērs:

defarithmetics(a, b):
return a - b

defarithmetics(a, b, c, d):
return a + b - c * d

print(arithmetics(1, 2, 3, 5)) # returns -12
print(arithmetics(1, 2)) # returns missing positional arguments error

instagram viewer

Objektorientētās valodas, piemēram, Java, bieži atbalsta funkciju un metožu pārslodzi. Metode ir vienkārši funkcija, kuru jūs definējat klasē.

Iepriekš minētajā kodā Python atpazīs tikai otro definīciju aritmētika () funkcija, kad mēģināt to izsaukt savā projektā. Ja mēģināt izsaukt funkciju ar diviem argumentiem, kā tas ir sākotnēji definēts, tiks parādīts kļūdas ziņojums “trūkst nepieciešamo pozicionālo argumentu”.

Jūs nesaņemsit kļūdu, izsaucot funkciju ar četriem argumentiem. Tas nozīmē, ka Python ir pārrakstījis funkciju ar savu jaunāko gadījumu. Tā nav pārslodzes uzvedība, tāpēc jums tas ir jācīnās.

Tātad Python pēc noklusējuma neapstrādā funkciju pārslodzi, taču ir daži triki, kurus varat izmantot, lai modelētu tā uzvedību savās programmās.

1. metode: izvēles parametru vai noklusējuma argumentu izmantošana

Pārslodzi var panākt, definējot funkciju ar noklusējuma argumentiem. Šeit ir piemērs:

defarithmetics(a, b=0, c=0):

Arguments:
a: The first number.
b: The second number (optional).
c: The third number (optional).

return a - b + c

Šai funkcijai ir trīs parametri, bet diviem no tiem ir noklusējuma vērtības. Tas nozīmē, ka varat to izsaukt ar vienu līdz trim argumentiem:

print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11

Lai gan šī pieeja ļauj izsaukt funkciju vairākos dažādos veidos, tā ilgtermiņā nav īpaši efektīva. Šeit ir daži no tā ierobežojumiem:

  • Jūs varat nodot tikai tādus argumentus, kas ir veseli skaitļi vai peld.
  • Funkcijas darbībā nav būtisku izmaiņu. Piemēram, jūs nevarat mainīt tā darbību, lai aprēķinātu formas laukumu vai pat izdrukātu Sveika pasaule.

2. metode: mainīgo argumentu izmantošana

Lai izmantotu mainīgos argumentus funkciju pārslodzei programmā Python, jums vajadzētu definējot funkciju, iekļaujiet parametru args. The args parametrs ļauj nodot vairākus pozicionālos argumentus, izsaucot savu funkciju. Šeit ir piemērs:

defarithmetics(a, *args):

Arguments:
a: The first number.
*args: A variable number of arguments (optional).

args_sum = 0

for num in args:
args_sum *= num

return a - args_sum

print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10

Iepriekš minētā funkcija izmanto divus argumentus: izsaukto obligāto argumentu a un args arguments, kas ļauj ievadīt tik daudz argumentu, cik nepieciešams.

Lai gan tai var būt nepieciešami vairāki argumenti, iepriekš minētā funkcija var veikt reizināšanas darbību tikai ar mainīgo argumentiem, t.i., ar argumentiem, ko attēlo args atslēgvārds.

Ja vēlaties veikt vairākas darbības, jums tas ir jādara savā kodā ievadiet nosacījumu paziņojumus, un tas var ātri kļūt sarežģīti.

3. metode: Multiple Dispatch Decorator izmantošana

Vairāku nosūtīšanas dekorētājs ir Python bibliotēka, kas ļauj definēt vairākas vienas funkcijas ieviešanas vai gadījumus, pamatojoties uz tās argumentu veidu. Tas nozīmē, ka varat definēt vienu un to pašu funkciju ar dažādiem datu tipiem un pilnībā mainīt tās darbību.

Lai izmantotu vairāku nosūtīšanas dekoratoru, veiciet šīs darbības:

  1. Uzstādīt multidispath jūsu Python vidē:
    pip install multipledispatch
  2. Izrotājiet savu funkciju(-as) ar @nosūtīšana dekorators. The @nosūtīšana dekorators ir a Python dekorētājs kas ļauj īstenot vairākkārtēju nosūtīšanu. Tas automātiski nosūtīs atbilstošo funkciju, pamatojoties uz argumentiem, ko tai nosūtāt. Jūs varat izmantot @nosūtīšana dekorētājs, ievērojot šo modeli:
    from multipledispatch import dispatch

    @dispatch(data type1, data type2, data typeX)
    defyour_function(a, b, c, x):
    pass
    # perform your operations here

Šeit ir piemērs, kas izmanto vairāku nosūtīšanas dekoratoru funkciju pārslodzei programmā Python:

from multipledispatch import dispatch

@dispatch(int, int)
defadd(a, b):

Arguments:
a: Any integer.
b: Any integer.

return a + b

@dispatch(int, list)
defadd(a, b):

Arguments:
a: Any integer.
b: Any Python list.

b.append(a)
return b

# returns 3
print(add(1, 2))

# returns [2, 3, 4, 5, 'w', 'done', 1]
print(add(1, [2, 3, 4, 5, 'w', 'done']))

Iepriekš minētais koda fragments definē divus gadījumus pievienot () funkciju. Pirmā instance kā argumentus izmanto divus veselus skaitļus un atgriež to summu.

Tikmēr šīs funkcijas otrajā versijā tiek izmantots vesels skaitlis un saraksts. Tas sarakstam pievieno veselu skaitli un atgriež jauno sarakstu.

Šī pieeja funkciju pārslodzei Python sniedz jums lielu elastību, it īpaši, ja jums ir jāmaina savas metodes darbība. Jūs varat uzzināt vairāk no vairākkārtējas nosūtīšanas dokumentācija.

Labākā pieeja funkciju pārslodzei programmā Python

Pieejai, ko izmantojat, lai nodrošinātu pārslodzi, ir jābūt atkarīgai no tā, ko jūs mēģināt sasniegt. Ja varat pabeigt uzdevumu, izmantojot noklusējuma vai mainīgus argumentus, iespējams, vairākkārtējas nosūtīšanas dekorētājs ir pārspīlēts. Tomēr daudzkārtējas nosūtīšanas dekorators parasti ir labākais risinājums tā efektivitātei un precizitātei.

Šis dekorētājs nodrošina tīru un elastīgu veidu, kā Python ieviest funkciju pārslodzi. Tas ļauj definēt vairākas vienas funkcijas ieviešanas, pamatojoties uz tās argumentu veidu.

Izmantojot šo pieeju, varat izveidot elastīgas funkcijas, kas var pieņemt dažādus parametru veidus, neizmantojot sarežģītus nosacījumu paziņojumus.