00:00V tomto videu se dozvíte o nové funkci pouze pozičních argumentů. Na začátku vás seznámím s příkladem. Toto video chci začít povídáním o vestavěné funkci s názvem float().

00:09float() lze použít k převodu textových řetězců nebo čísel na objekty float, například takto. Pokud vyvoláte funkci help() na vestavěné funkci float, když se podíváte na signaturu pro float přímo zde, všimnete si, že za parametrem je lomítko (/). Co to znamená? No, ukazuje se, že funkce float() má jeden parametr a ten se jmenuje x a při jejím volání nesmíte použít název parametru. Při použití parametru float() smíte zadávat argumenty pouze pomocí pozice, nikoli pomocí klíčového slova. Ukážu vám, co mám na mysli. Takže ještě jednou, všimněte si lomítka (/) zde. Stisknutím q se dostanete z help(). Takže když znovu zkusíte float() a řeknete x="3.8" – textový řetězec – uvidíte, že zde je napsáno float() takes no keyword arguments, pouze tento poziční argument.

00:53Při zadávání argumentu nemůžete použít klíčové slovo. Před verzí Python 3.8 neexistoval jednoduchý způsob, jak ve vlastních funkcích určit, že argumenty mají být pouze poziční. Takže pokud byste definovali něco jako tuto funkci – nazveme ji incr() (inkrementace).

01:10Když zavoláte incr() a řekněme, že jí zadáte float, můžete použít kteroukoli metodu, a to je pro běžný argument normální. A právě v tom spočívá změna v Pythonu 3.8.

01:24Mohli byste přepsat funkci inkrementace incr() tak, aby přijímala pouze poziční argumenty. Vypadalo by to spíš takto, s čárkou (,), pak lomítkem (/) a zbytek je stejný.

01:40Takže když zavoláš incr(), tak to funguje dobře. Pokud byste ale nyní použili klíčové slovo, stane se něco nového. Zde se píše incr() got some positional-only arguments passed as keyword arguments.

01:55Takže to vyvolá výjimku a dá vám TypeError. To můžete použít téměř jako předěl mezi vašimi argumenty, které jsou pouze poziční, a běžnými argumenty. Vyzkouším vám to na dalším příkladu.

02:07Definice nové funkce s názvem greet(). greet() bude přijímat name jako argument pouze pro pozici, pak tam dáte to lomítko (/), abyste mohli kombinovat argumenty pouze pro pozici s regulárními argumenty. Takže zde je regulární argument greeting.

02:23Tady budete vracet f-řetězec s greeting. Pokud jste s f-řetězci ještě nepracovali, uvedu v textu níže odkaz na články a kurzy o něm.

02:31Čárka, mezera, name. Takže když zavoláte greet() – opět, výchozí greeting bude "Hello".

02:37Tady zadáte name pouze jako poziční.

02:43Skvělé. Mohli byste také zavolat greet()

02:49a dát mu greeting.

02:55Co ale nemůžete udělat – nebo co vám způsobí chybu – je, když zadáte name,

03:08zde dostanete výjimku TypeError. Opět, stejně jako v předchozím případě pro incr(), greet() dostal některé argumenty určené pouze pro pozici předané jako argumenty klíčového slova, konkrétně name. Na první pohled se může zdát, že poziční argumenty trochu omezují a jsou v rozporu s mantrou Pythonu o důležitosti čitelnosti.

03:26Pravděpodobně zjistíte, že není mnoho případů, kdy by pouze poziční argumenty vylepšily váš kód. Za správných okolností vám však může poskytnout určitou flexibilitu při navrhování funkcí.

03:35Předně, argumenty pouze na pozici mají smysl, když máte argumenty, které mají přirozené pořadí, ale je těžké jim dát dobré popisné názvy. Další výhodou používání pouze pozičních argumentů je, že můžete snadněji refaktorovat své funkce – zejména můžete měnit jména parametrů, aniž byste se museli obávat, že na těchto jménech závisí další kód.

03:57Zopakujme si tuto informaci: Jak zadáváte pouze poziční argumenty? Pomocí lomítka (/) označujete, že argumenty před ním musí být specifikovány pozicí. Chcete-li se o lomítkové poznámce dozvědět více, v PEP 457 o ní najdete podrobnou diskusi. PEP 570 se věnuje parametrům Pythonu určeným pouze pro pozici mnohem hlouběji. Odkazy na oba jsou v textu pod tímto videem.

04:20Doplňkem argumentů pouze pro pozici by byly argumenty pouze pro klíčová slova, a ty jsou k dispozici v jakékoli verzi Pythonu 3. To, že chcete argumenty pouze s klíčovými slovy, můžete specifikovat pomocí hvězdičky (*).

04:31Všechny argumenty po tomto * musí být specifikovány pomocí klíčového slova. Zde je příklad převodu na Fahrenheita a můžete zde vidět, že má argument pouze s klíčovým slovem celsius.

04:46Dovolte mi, abych vám tuto funkci vyzkoušel. Takže zde, abyste zadali pouze klíčové slovo, vložíte * a za něj vložíte argument klíčového slova – v tomto případě celsius. A v tomto případě return

05:0232 + celsius * 9 / 5. Takže tady, kdybyste zavolali to_fahrenheit() a dali mu jen hodnotu, řekněme 40 stupňů Celsia, tak tady je napsáno, že to takes 0 positional arguments but 1 was given.

05:16Takže to vyžadovalo, abyste tam měli klíčové slovo, aby se to správně zavolalo. A také, v závislosti na okolnostech, můžete chtít kombinovat argumenty pouze s pozičními, regulárními a pouze s klíčovými slovy. To uděláte tak, že je zadáte oddělené tím lomítkem (/) a hvězdičkou (*).

05:35Takže by to vypadalo nějak takto. Zde je pozice pouze text, lomítko (/). Zde standardní argument.

05:46A nyní, za border, pomocí *, argument pouze s klíčovým slovem width, který má standardní hodnotu 50.

05:54Vracíte f-řetězec s mezerou před hodnotou pro argument text a pak další mezerou. A pak používáš metodu textového řetězce .center() se dvěma parametry, které bereš z těchto argumentů, width a border.

06:08Jediný, který je poziční, je text. Mohli byste začít s headline() a říct "Positional-only".

06:18Tady vidíte výchozí hodnotu, která bude tímto typem rámečku s width 50, vypadá to nějak takhle. Opět, protože je to pouze poziční, kdybyste tomu dali text,

06:35to by vyvolalo chybu, TypeError. Pro border je to regulérní argument. Takže v tomto případě byste místo toho mohli říct jen hodnotu, řekněme třeba znaménko rovnosti ("=").

06:49Nebo byste mohli skutečně zadat, že border se rovná třeba dvojtečce (:). Bude akceptovat oba styly. Ale width musí být zadáno pomocí klíčového slova, pokud ho hodláte zadat…

07:07přepsat výchozí hodnotu 38.

07:15Pokud byste zadali jen hodnotu 38, opět by to vyvolalo výjimku a dostali byste TypeError: headline() takes 1 to 2 positional arguments but 3 were given. Takže ten opět musí být argumentem s klíčovým slovem.

07:29Jak tedy vidíte, argumenty pouze s pozičními slovy mohou pěkně doplňovat běžné argumenty a argumenty pouze s klíčovými slovy. V příštím videu se dozvíte, jak Python 3.8 vylepšuje typovou kontrolu pomocí přesnějších typů.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.