Magjia e yllit në Python - Pjesa II

Pra, ju keni lexuar "magjinë bazë të yllit në python" dhe tani dëshironi më shumë? Sigurisht. Koha për të hyrë në kështjellë. Nëse nuk jeni ende gati, mos ngurroni të vizitoni artikullin e mëparshëm dhe kthehuni kur të ndjeheni se jeni gati. Ose të paktën, ju keni provuar tuajën.

Në këtë artikull, ne do të flasim kryesisht për PEP3102 i cili propozoi vetëm fjalë kyçe argumente për python.

Argumentet e fjalëve kyçe

Në "glossary python", do të gjeni një seksion që përcakton se çfarë do të thotë argument në python. Ashtu si çdo gjuhë tjetër programimi, një argument është një vlerë që kalon në funksion (ose metodë) kur kryen thirrjet e funksionit. Në python, ekzistojnë 2 lloje argumentesh:

  1. Argumenti i fjalës kyçe
    Argumenti i fjalës kyç është një argument i paraprirë nga një identifikues (argumente të emërtuara). Vini re se vlera këtu kalon në një thirrje funksioni dhe jo vlera e paracaktuar kur përcaktohen parametrat e funksionit.
  2. Argumenti Pozicional
    Një argument pozicional, thjesht, është i gjithë argumenti që nuk është argument i fjalës kyçe.

Një shembull është kur përdorim requests.get, ne shpesh e kalojmë URL-në në një varg drejtpërdrejt. Në këtë skenar, ne i japim funksionit një argument pozicional për parametrin url. Por, nëse kalojmë një vlerë diçka si requests.get(url='https://your-url.com/'), atëherë po kalojmë në një argument me fjalë kyçe.

Mos e ngatërroni veten me argumentet të kërkuara dhe opsionale. Këto 2 janë për shkak të kur përcaktojmë një funksion me parametrat e tij. Nëse përfshijmë një parametër me vlerë të paracaktuar, më vonë argumenti bëhet opsional. Përndryshe, na kërkohet të kalojmë një argument, prandaj kërkohet argument pozicional.

Tani, kur bëjmë një thirrje funksioni, na takon ne të kalojmë argumentet si argument pozicional ose fjalë kyçe. Por, meqenëse python mbështet lexueshmërinë, duhet marrë parasysh nëse argumentet janë të dukshme që duhet të kalohen, atëherë ne thjesht kalojmë vlerën si një argument pozicional. Në të kundërt, gjithashtu ka shumë të ngjarë, ne duam që përdoruesit e tjerë të dinë se çfarë vlere kalojmë në cilin parametër. Pra, argumenti i fjalës kyçe.

Argumente vetëm me fjalë kyçe

Përdorimi i yjeve gjatë përcaktimit të një funksioni, na jep një nivel më të lartë magjie. Quhet argumente vetëm me fjalë kyçe. Ky lloj argumenti ka një sjellje të ngjashme si argumenti i fjalës kyçe vanilje, por ai detyron përdoruesit të kalojnë argumentet e fjalëve kyçe në vend të argumenteve pozicionale ose të drejtpërdrejta.

def generate_username(*users, separator, length=None):
    users = [user.lower().split() for user in users]
    username = [separator.join(user) for user in users]
    if length:
        username = [user[:length] for user in username]
    return username

Le të përdorim funksionin e mësipërm si shembull. Funksioni do të gjenerojë emra përdoruesish në një mënyrë të thjeshtë, me ndarësin e personalizuar të përdoruesve. Vini re se ai përdor argumente paketimi atje. Pra, mund ta quajmë si

>>> generate_username("John", "Mr Smith", "Mrs Smith", separator="_")

dhe do të rezultojë ['john', 'mr_smith', 'mrs_smith'].

Tani, ku është magjia që pyet? Provoni të kaloni "_" si argument pozicional si më poshtë.

>>> generate_username("John", "Mr Smith", "Mrs Smith", "_")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: get_username() missing 1 required keyword-only argument: 'separator'

Merre atë gabim! Ju mungon 1 argument i kërkuar vetëm për fjalë kyçe: ndarës. Cfare eshte kjo? Ky, në fakt, është efekti i përdorimit të një ylli në një funksion të ndjekur nga një parametër i kërkuar, separator.

Siç tha PEP 3102, çdo parametër i përcaktuar pas një ylli në një funksion duhet të kalojë argumentet vetëm për fjalë kyçe. Kjo do të thotë, duke specifikuar emrin e parametrit. Kjo na lejon të përcaktojmë parametra shtesë pas yjeve që nuk do të paketohen së bashku. Meqenëse ngulitim yllin me parametrin users, ai bëhet një argument opsional i paketimit pozicional.

Argumenti opsional i paketimit pozicional është një argument paketimi ashtu siç përshkruhet në "artikullin e mëparshëm".

Funksioni i mësipërm do të thithë çdo argument pozicional përpara se të kalojmë një argument të fjalës kyçe për separator. Tani çka nëse nuk duam të kapim ndonjë argument pozicional, në shembullin e mësipërm, për parametrinusers. Ne mund të përdorim vetëm magjinë, vetëm një yll të vetëm. Le të ripërcaktojmë funksionin e mësipërm.

def generate_username(users, *, separator, length=None):
    users = [user.lower().split() for user in users]
    username = [separator.join(user) for user in users]
    if length:
        username = [user[:length] for user in username]
    return username

Dallimi këtu është se ne nuk mund të kalojmë asnjë numër argumentesh pozicionale, përkundrazi ne e kalojmë atë në parametrin users si një koleksion (listë ose tuple).

>>> list_users = ["jhonny", "Jadon Smith", "Mr Smith", "Mrs Smith"]
>>> generate_username(list_users, separator="_")
['jhonny', 'jadon_smith', 'mr_smith', 'mrs_smith']

Nëse kalojmë një "_" si një argument pozicional, ai do të hedhë një gabim si më poshtë.

>>> generate_username(list_users, "_")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: generate_username() takes 1 positional argument but 2 were given

Kjo është për shkak se çdo parametër i mbetur pas yllit * do të kërkojë një fjalë kyçe për të kaluar argumentet, siç thuhet në PEP 3102 më poshtë.

Meqenëse Python kërkon që të gjitha argumentet të jenë të lidhura me një vlerë, dhe meqenëse mënyra e vetme për të lidhur një vlerë me një argument vetëm me fjalë kyçe është përmes fjalës kyçe, argumente të tilla janë argumente "fjalë kyçe të kërkuara".

Marrëveshje

Duke përdorur yjet në python, ne kemi "2 opsione" për të përcaktuar një funksion me argumente vetëm për fjalë kyçe:

  1. Argumente vetëm për fjalë kyçe me një argument pozicional
  2. Argumente vetëm me fjalë kyçe pa argument pozicional

Këta 2 skenarë janë propozuar së pari në PEP 3102, mund të lexoni më shumë rreth arsyes pse ekziston kjo magji.

Referencat

[1] Trey Hunner, "Asterisks in Python: çfarë janë dhe si t'i përdorim ato" (2018)

[2] PEP 3102