11.1 Nieskończona liczba parametrów
W Pythonie funkcje mogą być zaprojektowane tak, aby przyjmowały nieskończoną ilość parametrów. Osiąga się to za pomocą argumentów przekazywanych przez *args
dla zwykłych parametrów i **kwargs
dla parametrów zadanych po nazwie.
Użycie *args
*args
pozwala funkcji przyjmować dowolną liczbę pozycyjnych argumentów, które funkcja będzie postrzegać jako krotkę. Przykład użycia:
def print_all(*args):
for item in args:
print(item)
print_all(1, 'apple', True) # wyświetli 1, apple i True.
Zmienna args
będzie zawierać krotkę wszystkich parametrów, które zostały przekazane do funkcji przy jej wywołaniu.
Użycie **kwargs
**kwargs
działa podobnie do *args
, ale dla argumentów zadanych po nazwie, przedstawionych w formie słownika. To pozwala funkcji przyjmować dowolną liczbę nazwanych argumentów:
def print_named_items(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_named_items(fruit='apple', number=1) # wyświetli fruit: apple i number: 1
Te mechanizmy czynią funkcje niezwykle elastycznymi i użytecznymi w scenariuszach, gdzie liczba parametrów jest nieznana z góry, na przykład przy tworzeniu API albo funkcji obsługi zdarzeń.
Szczegółowo oba te przypadki omówimy później, ale musicie wiedzieć, że w Pythonie wewnątrz funkcji można bardzo łatwo uzyskać dostęp do wszystkich argumentów, które do niej przekazano. A przekazać w funkcji można wszystko, co chcecie.
11.2 Określenie typów
Jak wiecie, zmienne w Pythonie nie mają z góry określonego typu. Każdej zmiennej można przypisać wartość dowolnego typu, a w następnym wierszu przypisać wartość nowego typu itd.
To bardzo wygodne dla małych programów i nieco mniej dla dużych. Kiedy program jest bardzo duży i liczba funkcji idzie w tysiące, programista nie może zapamiętać, jakie dokładnie dane należy przekazać do funkcji i w jakiej kolejności.
W językach ze statycznym typowaniem IDE sama podpowiada programistom, jakie parametry i z jakimi typami trzeba przekazać przy wywołaniu funkcji. A Python - to wciąż język z dynamicznym typowaniem, i tu takie podpowiedzi nie mają skąd się pojawić.
Dlatego twórcy Pythona wymyślili taką rzecz, jak type hinting
. To coś w rodzaju typów zmiennych, ale są raczej rekomendacjami niż typami. Żadne ograniczenia wskazane typy nie narzucają.
Określenie typów zostało wprowadzone w Pythonie 3.5 i zyskało popularność dzięki standardowi PEP 484. To mechanizm, który pozwala programistom określać oczekiwane typy zmiennych, argumentów i wartości zwracanych funkcji.
Chociaż Python pozostaje językiem dynamicznie typowanym, określenie typów dodaje jasności i wspiera statyczne sprawdzanie typów. Przykłady określenia typów:
def add_numbers(a: int, b: int) -> int:
return a + b
Typ zmiennej określa się przez dwukropek, a typ zwracanego wyniku funkcji przez strzałkę.
Zalety, jakie daje określenie typu-rekomendacji:
- Poprawa dokumentacji: Jawne określenie typów sprawia, że kod staje się samodokumentujący.
- Lepsza autouzupełnianie: Edytory kodu mogą wykorzystywać informacje o typach do poprawy autouzupełniania.
- Pomoc w debugowaniu: Statyczne sprawdzanie typów może wykrywać potencjalne błędy jeszcze przed uruchomieniem programu.
Narzędzia do pracy z typami
Sam Python w żaden sposób nie reaguje na zadeklarowane typy zmiennych. Zamiast tego Python ma specjalne narzędzie — mypy — popularny statyczny analizator typów, który pomaga wyłapywać błędy w kodzie, wykorzystującym określenie typów.
GO TO FULL VERSION