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.