00:00Ez a videó a csak pozicionális argumentumok új funkciójáról fog szólni. Egy példával fogom kezdeni. A videót azzal szeretném kezdeni, hogy a float() nevű beépített függvényről beszélek.

00:09float() szöveges karakterláncok vagy számok float objektumokká alakítására használható, például így. Ha előhívjuk a help() függvényt a beépített float függvényen, ha megnézzük a float aláírását itt, akkor észrevehetjük, hogy a paraméter után egy perjel (/) van. Ez mit jelent? Nos, kiderül, hogy a float()-nek egy paramétere van, és ennek a neve x, és a híváskor nem használhatod a paraméter nevét. A float() használatakor az argumentumokat csak pozíció szerint szabad megadni, kulcsszóval nem. Hadd mutassam meg, hogy mire gondolok. Tehát még egyszer, figyeljük meg itt is a perjelet (/). A q megnyomásával kijutunk a help()-ből. Tehát ha újra megpróbálod a float()-öt, és azt mondod, hogy x="3.8" – egy szöveges karakterlánc -, akkor itt azt látod, hogy float() takes no keyword arguments, csak ez a pozíciós argumentum.

00:53Nem használhatsz kulcsszót, amikor megadod az argumentumot. A Python 3.8 előtt nem volt egyszerű módja annak, hogy megadjuk, hogy az argumentumok csak pozicionálisak legyenek a saját függvényeinkben. Tehát ha definiálnál valami ilyesmit, mint ez a függvény – hívjuk incr() (inkrement).

01:10Amikor meghívod a incr()-et, és mondjuk egy float-ot adsz neki, bármelyik módszert használhatod, és ez normális egy normál argumentum esetében. És itt jön a változás a Python 3.8-ban.

01:24Az inkrement incr() függvényt átírhatod úgy, hogy csak pozicionális argumentumokat fogadjon el. Inkább így nézne ki, egy vesszővel (,), majd egy slash (/), a többi pedig ugyanaz.

01:40Az incr() hívásakor ez így működik. De ha most a kulcsszót használnád, valami új történik. Itt az áll, hogy incr() got some positional-only arguments passed as keyword arguments.

01:55Szóval ez kivételt fog kiváltani, és egy TypeError-ot ad. Ezt szinte elválasztóként használhatod a csak pozicionális és a normál argumentumok között. Hadd próbáljam ki ezt egy másik példával.

02:07Definiálj egy új függvényt greet() néven. A greet() egy name-ot fog elfogadni, mint csak pozicionális argumentumot, aztán oda fogod tenni azt a perjelet (/), hogy kombinálni tudd a csak pozicionális és a normál argumentumokat. Tehát itt egy greeting szabályos argumentum.

02:23Itt egy f-stringet fogsz visszaadni a greeting-vel. Ha még nem dolgoztál f-stringekkel, az alábbi szövegben mellékelek egy linket az erről szóló cikkekhez és tanfolyamokhoz.

02:31Komma, szóköz, a name. Tehát amikor meghívod a greet() – ismétlem, az alapértelmezett greeting a "Hello" lesz.

02:37Az name-t itt csak pozíciósan fogod beírni.

02:43Nagyszerű. Meghívhatod a greet()

02:49és adhatsz egy greeting-et is.

02:55De amit nem tehetsz meg – vagy ami hibát fog adni -, ha beírod a name,

03:08itt egy TypeError kivételt kapsz. Ismét csakúgy, mint az előző incr()-nél, a greet() is kapott néhány csak pozicionális argumentumot kulcsszavas argumentumként átadva, konkrétan name. Első pillantásra a pozicionális argumentumok kissé korlátozónak tűnhetnek, és ellentmondanak a Python mantrájának az olvashatóság fontosságáról.

03:26Valószínűleg nem sok olyan alkalom van, amikor a csak pozicionális argumentumok javítják a kódodat. Megfelelő körülmények között azonban némi rugalmasságot adhat a függvények tervezésekor.

03:35Először is, a csak pozicionális argumentumoknak akkor van értelme, ha olyan argumentumaink vannak, amelyeknek természetes sorrendjük van, de nehéz jó leíró nevet adni nekik. A csak pozicionális argumentumok használatának másik előnye, hogy könnyebben refaktorálhatod a függvényeidet – különösen, hogy megváltoztathatod a paramétereid nevét anélkül, hogy aggódnod kellene amiatt, hogy más kód függ ezektől a nevektől.

03:57Ezt az információt megismételve, hogyan adhatsz meg csak pozicionális argumentumokat? A perjelet (/) használod annak jelölésére, hogy az előtte lévő argumentumokat pozíció szerint kell megadni. Ha többet szeretne megtudni a slash-jelölésről, a PEP 457 részletes tárgyalást tartalmaz róla. A PEP 570 sokkal mélyebbre merül a Python csak pozicionális paraméterekben. A linkek mindkettőhöz a videó alatti szövegben találhatók.

04:20A csak pozícióra vonatkozó argumentumok kiegészítője a csak kulcsszóra vonatkozó argumentumok, és ezek a Python 3 bármelyik verziójában elérhetőek. Egy csillaggal (*) adhatjuk meg, hogy csak kulcsszavas argumentumokat szeretnénk.

04:31A * után minden argumentumot kulcsszóval kell megadni. Itt van egy példa a Fahrenheitre való konvertálásra, és itt láthatod, hogy csak kulcsszavas argumentummal rendelkezik: celsius.

04:46Hadd próbáljam ki ezt a függvényt. Tehát itt a csak kulcsszavas megadáshoz egy *-t kell beírni, majd utána a kulcsszavas argumentumot – ebben az esetben celsius. És ebben az esetben a return

05:0232 + celsius * 9 / 5. Tehát itt, ha meghívnád to_fahrenheit() és csak egy értéket adnál meg, mondjuk 40 Celsius fokot, itt azt írja, hogy takes 0 positional arguments but 1 was given.

05:16Szóval szükség volt egy kulcsszóra, hogy megfelelően hívd meg. És az is előfordulhat, hogy a körülményektől függően kombinálni akarod a csak pozicionális, a szabályos és a csak kulcsszavas argumentumokat. Ehhez meg kell adnod őket, hogy ezzel a perjel (/) és a csillaggal (*) elválasztva.

05:35Ez tehát valahogy így nézne ki. Itt csak a text pozíciója, a ferdehajlat (/). Itt a standard argumentum.

05:46És most, a border után, a * használatával, a width csak kulcsszavas argumentum, amelynek alapértelmezett értéke 50.

05:54Egy f-stringet adsz vissza, a text argumentum értéke előtt egy szóközzel, majd egy másik szóközzel. És akkor a .center() szöveges karakterlánc módszerét használod két paraméterrel, amelyeket ezekből az argumentumokból veszel, width és border.

06:08Az egyetlen, ami pozicionális, az a text. Kezdheted a headline()-vel és mondhatod, hogy "Positional-only".

06:18Itt láthatod az alapértelmezett értéket, ami ilyen típusú határ lesz egy width 50-vel, valami ilyesmi kinézetű. Ismétlem, mivel ez csak pozicionális, ha megadnád text,

06:35az hibát, egy TypeError-ot vetne fel. A border esetében ez egy normál argumentum. Tehát ebben az esetben mondhatnál csak egy értéket, mondjuk, mondjuk, az egyenlőségjelet ("=") helyette.

06:49Vagy ténylegesen megadhatnád, hogy border egyenlő, mondjuk, egy kettősponttal (:). Mindkét stílust elfogadja. De a width-t kulcsszóval kell megadni, ha be akarod írni…

07:07Az alapértelmezettet 38 értékkel felülbírálva.

07:15Ha csak a 38 értéket adnád meg, az ismét kivételt váltana ki, és TypeError: headline() takes 1 to 2 positional arguments but 3 were given-et kapnál. Tehát ismét kulcsszavas argumentumnak kell lennie.

07:29Amint látod, a csak pozicionális argumentumok szépen kiegészíthetik a normál argumentumokat és a csak kulcsszavas argumentumokat. A következő videóban megtudhatod, hogy a Python 3.8 hogyan javítja a típusellenőrzést a pontosabb típusok használatával.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.