00:00Ten film będzie mówił o nowej funkcji argumentów tylko pozycyjnych. Zaczniemy od przykładu. Chcę rozpocząć ten film od omówienia wbudowanej funkcji o nazwie float().

00:09float() może być użyta do konwersji ciągów tekstowych lub liczb na obiekty float, takie jak ten. Jeśli przywołasz funkcję help() na wbudowaną funkcję float, jeśli spojrzysz na sygnaturę dla float właśnie tutaj, zauważysz, że po parametrze znajduje się ukośnik (/). Co to oznacza? Cóż, okazuje się, że jest jeden parametr float() i nazywa się on x, a ty nie możesz używać nazwy parametru podczas jego wywoływania. Kiedy używasz float(), możesz określać argumenty tylko przez pozycję, a nie przez słowo kluczowe. Pozwól, że pokażę ci, co mam na myśli. Więc ponownie, zauważ ukośnik (/) tutaj. Naciśnięcie q spowoduje wyjście z help(). Więc jeśli spróbujesz float() ponownie i powiesz x="3.8" – łańcuch tekstowy – zobaczysz tutaj, że mówi float() takes no keyword arguments, tylko ten argument pozycyjny.

00:53Nie możesz użyć słowa kluczowego, gdy określasz argument. Przed Pythonem 3.8 nie było łatwego sposobu, aby określić, że argumenty powinny być tylko pozycyjne w twoich własnych funkcjach. Więc jeśli miałeś zdefiniować coś takiego jak ta funkcja – nazwiemy ją incr() (increment).

01:10Gdy wywołasz incr() i powiedzmy, że dasz mu float, możesz użyć dowolnej metody, i to jest normalne dla zwykłego argumentu. I tu właśnie pojawia się zmiana w Pythonie 3.8.

01:24Mógłbyś przepisać funkcję increment incr(), aby akceptowała argumenty tylko pozycyjne. Wyglądałoby to bardziej podobnie do tego, z przecinkiem (,) następnie ukośnikiem (/), a reszta jest taka sama.

01:40Więc kiedy wywołujesz incr(), to działa dobrze. Ale jeśli miałbyś teraz użyć słowa kluczowego, dzieje się coś nowego. Jest tu napisane incr() got some positional-only arguments passed as keyword arguments.

01:55So to podniesie wyjątek i da ci TypeError. Możesz użyć tego prawie jako rozdzielacza między argumentami tylko pozycyjnymi a zwykłymi argumentami. Pozwól, że wypróbuję to na innym przykładzie.

02:07Zdefiniuj nową funkcję o nazwie greet(). greet() będzie przyjmować name jako argument tylko pozycyjny, a następnie umieścisz tam ten ukośnik (/), abyś mógł połączyć argumenty pozycyjne z regularnymi. Więc tutaj jest regularny argument greeting.

02:23Tutaj zwrócisz f-string z greeting. Jeśli jeszcze nie pracowałeś z f-stringami, w tekście poniżej zamieszczam link do artykułów i kursów na ten temat.

02:31Przecinek, spacja, name. Więc kiedy wywołasz greet() – znowu, domyślnym greeting będzie "Hello".

02:37Wpiszesz tutaj name jako tylko pozycyjny.

02:43Doskonale. Możesz również zadzwonić do greet()

02:49i dać mu greeting.

02:55Ale to, czego nie możesz zrobić – lub co da ci błąd – to jeśli wpiszesz name,

03:08tutaj dostaniesz wyjątek TypeError. Ponownie, tak jak w poprzednim przypadku dla incr(), greet() dostał kilka argumentów pozycyjnych przekazanych jako argumenty słowa kluczowego, a konkretnie name. Na pierwszy rzut oka argumenty pozycyjne mogą wydawać się nieco ograniczające i sprzeczne z mantrą Pythona o znaczeniu czytelności.

03:26Prawdopodobnie przekonasz się, że nie ma zbyt wielu okazji, w których argumenty pozycyjne poprawiają Twój kod. Jednakże, w odpowiednich okolicznościach, może to dać ci pewną elastyczność podczas projektowania funkcji.

03:35Po pierwsze, argumenty pozycyjne mają sens, gdy masz argumenty, które mają naturalną kolejność, ale są trudne do nadania dobrych nazw opisowych. Inną korzyścią z używania argumentów pozycyjnych jest to, że możesz łatwiej refaktoryzować swoje funkcje – w szczególności, możesz zmienić nazwę swoich parametrów bez obawy, że inny kod zależy od tych nazw.

03:57Aby powtórzyć te informacje, jak określić argumenty pozycyjne? Używasz ukośnika (/) do oznaczenia, że argumenty przed nim muszą być określone przez pozycję. Aby dowiedzieć się więcej o notacji ukośnika, PEP 457 zawiera dogłębną dyskusję na jej temat. PEP 570 zagłębia się znacznie bardziej w parametry pozycyjne Pythona. Linki do nich znajdują się w tekście poniżej tego filmu.

04:20Zupełnym uzupełnieniem argumentów pozycyjnych byłyby argumenty oparte na słowach kluczowych, a te są dostępne w każdej wersji Pythona 3. Możesz określić, że chcesz mieć argumenty tylko na słowo kluczowe, używając gwiazdki (*).

04:31Wszystkie argumenty po tym * muszą być określone za pomocą słowa kluczowego. Tutaj jest przykład konwersji do Fahrenheita, i można zobaczyć, że ma tylko słowo kluczowe argument celsius.

04:46Pozwól mi wypróbować tę funkcję. Więc tutaj, aby określić słowo kluczowe, umieściłbyś *, a następnie umieściłbyś argument słowa kluczowego po – w tym przypadku, celsius. A w tym przypadku, return

05:0232 + celsius * 9 / 5. Więc tutaj, gdybyś miał zadzwonić do to_fahrenheit() i po prostu dać mu wartość, powiedzmy 40 stopni Celsjusza, to mówi tutaj, że to takes 0 positional arguments but 1 was given.

05:16Więc wymagało to, że masz słowo kluczowe tam, aby wywołać go poprawnie. A także, w zależności od okoliczności, możesz chcieć połączyć argumenty tylko pozycyjne, regularne i słowa kluczowe. Aby to zrobić, podałbyś je oddzielone ukośnikiem (/) i gwiazdką (*).

05:35Więc wyglądałoby to mniej więcej tak. Tutaj, tylko pozycja text, ukośnik (/). Tutaj, standardowy argument.

05:46A teraz, po border, używając *, argumentu keyword-only z width, który ma domyślną wartość 50.

05:54Zwracasz f-string ze spacją przed wartością dla argumentu text, a następnie kolejną spacją. A potem używasz metody text string w .center() z dwoma parametrami, które bierzesz z tych argumentów, width i border.

06:08Jedynym, który jest pozycyjny, jest text. Możesz zacząć od headline() i powiedzieć "Positional-only".

06:18Tutaj możesz zobaczyć domyślną wartość, która będzie tym typem granicy z width z 50, wyglądającą coś takiego. Ponownie, ponieważ jest to tylko pozycyjne, jeśli miałbyś dać mu text,

06:35 to podniósłby błąd, TypeError. Dla border, jest to zwykły argument. Więc w tym przypadku, można powiedzieć tylko wartość, powiedzmy jak, znak równości ("=") zamiast.

06:49Or można rzeczywiście określić, że border równa się, powiedzmy, dwukropek (:). Zaakceptuje każdy z tych stylów. Ale width musi być określony za pomocą słowa kluczowego, jeśli zamierzasz go wprowadzić…

07:07Odstępując od domyślnego z wartością 38.

07:15Jeśli miałbyś dać mu tylko wartość 38, to znowu podniosłoby wyjątek, otrzymując TypeError: headline() takes 1 to 2 positional arguments but 3 were given. Więc znowu, ten jeden musi być argumentem słowa kluczowego.

07:29Jak więc widzisz, argumenty pozycyjne mogą ładnie uzupełniać zwykłe argumenty i argumenty słowa kluczowego. W następnym filmie dowiesz się, jak Python 3.8 usprawnia sprawdzanie typów poprzez użycie bardziej precyzyjnych typów.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.