Co prawda Python 3.11 wyszedł w październiku zeszłego roku to dopiero niedawno miałem czas przyjrzeć się nowościom i zmianom w tej wersji języka. Nie ma ich co prawda bardzo dużo, ale niektóre wydają się dość ciekawe i do zastosowania nie tylko przez zaawansowanych programistów. Sam jako domyślny język używam od wielu miesięcy wersji 3.10, którą uważam za stabilną. Spójrzmy zatem co przynosi wersja 3.11.
Dwie nowe metody operowania na ciągach znaków
W Python 3.11 dodano nowe metody łańcuchowe: str.removeprefix() i str.removesuffix(), które umożliwiają łatwe usunięcie określonego prefiksu lub sufiksu z ciągu znaków. Tego typu operacje zazwyczaj musieliśmy zaprogramować samodzielnie lub korzystać z zewnętrznych bibliotek do operacji na łańcuchach znaków. Używanie ich jest bardzo proste:
string = "bardzo-lubie-programowac" prefix = "bardzo-" new_string = string.removeprefix(prefix) print(new_string) # Output: "lubie-programowac" string = "bardzo-lubie-programowac" suffix = "-programowac: new_string = string.removesuffix(suffix) print(new_string) # Output: "bardzo-lubie"
W pierwszym przykładzie metoda removeprefix() służy do usunięcia przedrostka „bardzo-” z łańcucha „bardzo-lubie-programowac”. Wynikowy ciąg znaków new_string to „lubie-programowac”.
string = "bardzo-lubie-programowac" prefix = "bardzo-" new_string = string.removeprefix(prefix) print(new_string) # Output: "lubie-programowac"
W drugim przykładzie metoda removesuffix() służy do usunięcia sufiksu „-programowac” z łańcucha „bardzo-lubie-programowac”. Wynikowy ciąg znaków new_string to „bardzo-lubie”.
Jeśli określony prefiks lub sufiks nie istnieje w ciągu, te metody zwrócą oryginalny ciąg bez zmian.
Adnotacje typów dla zmiennych w Python 3.11
Adnotacje typu dla zmiennych w umożliwiają deklarowanie typów zmiennych w kodzie, ułatwiając zrozumienie oczekiwanych typów danych wejściowych i wyjściowych. W Python 3.11 są obsługiwane w standardowej składni definicji funkcji, co ułatwia deklarowanie typów zmiennych w kodzie. Popatrzmy jak to wygląda na przykładzie prostej metody dodawania dwóch zmiennych:
# Example: Declaring the type of a variable x: int = 10 print(x) # Output: 10 # Example: Declaring the types of function arguments and return values def add(a: int, b: int) -> int: return a + b result = add(5, 6) print(result) # Output: 11
W pokazanym przykładzie metoda add
jest zdefiniowana z adnotacjami typu dla argumentów funkcji a
i b
oraz wartości zwracanej. Argumenty funkcji są opatrzone adnotacją typu int
, a zwracana wartość opatrzona jest adnotacją -> int
. Oznacza to, że metoda ta przyjmuje dwa argumenty typu int i zwraca wynik typu int.
Adnotacje typu są opcjonalne w Pythonie, ale mogą być przydatne do dokumentowania oczekiwanych typów zmiennych i do wychwytywania błędów typu w czasie wykonywania. Mogą być również używane przez narzędzia, takie jak linters i edytory kodu, w celu zapewnienia ulepszonego sprawdzania błędów i sugestii dotyczących uzupełniania kodu.
Ulepszone komunikaty błędów
W Pythonie 3.11 wprowadzono ulepszone komunikaty o błędach, aby w niektórych przypadkach wyświetlać bardziej pomocne i szczegółowe komunikaty o błędach.
def func(a, b): pass try: func() except TypeError as e: print(e) # Output: "func() missing 2 required positional arguments: 'a' and 'b'"
func
jest zdefiniowana z dwoma wymaganymi argumentami a
i b
. Kiedy funkcja jest wywoływana bez żadnych argumentów, zgłaszany jest TypeError
z bardziej szczegółowym komunikatem o błędzie wskazującym, że w wywołaniu funkcji brakuje wymaganych argumentów. try: 'hello'.nonexistent_attribute except AttributeError as e: print(e) # Output: "'str' object has no attribute 'nonexistent_attribute'"
W drugim przykładzie AttributeError
jest zgłaszany podczas próby uzyskania dostępu do nieistniejącego atrybutu nonexistent_attribute
obiektu łańcuchowego. Ulepszony komunikat o błędzie zawiera bardziej szczegółowe informacje o typie obiektu, który nie ma określonego atrybutu.
Te ulepszone komunikaty o błędach ułatwiają zrozumienie, co poszło nie tak i jak naprawić problem oszczędzając przy tym nasz czas.