AdminDays - skrypt z warsztatów

AdminDays – skrypt z warsztatów

AdminDays - skrypt z warsztatów

W zeszłym tygodniu, 25 marca, w ramach eventu AdminDays miałem przyjemność poprowadzić warsztaty/prezentację związaną z automatyzacją w środowisku sieciowym. W czasie spotkania pokazałem proces tworzenia skryptu w języku Python, który wykonuje proste czynności administracyjne związane z odczytaniem i rekonfiguracją interfejsu Loopback. Z samym urządzeniem połączenie następuje za pomocą protokołu RESTCONF, a jeżeli ten jest niedostępny to za pomocą SSH z wykorzystaniem biblioteki Netmiko. Skrypt, wraz z zestawem linków do podstawowych bibliotek, które każdy programista sieciowy powinien znać, znajduje się w repozytorium GitHub Szkoły DevNet.

Czytaj dalej
Łączenie zmiennych słownikowych

Łączenie zmiennych słownikowych

Łączenie zmiennych słownikowych

W krótkim artykule opisującym nowości w języku Python w wydaniu 3.9 zwróciłem uwagę na dwa operatory pozwalające na operowanie na zmiennych typu słownikowego (dict). W dzisiejszym wpisie w ramach Wtorków z Pythonem pokażę Ci kilka sposobów na łączenie dwóch lub więcej zmiennych słownikowych ze sobą. Pisząc swoje programy do automatyzacji bardzo często będziesz te operacje wykonywać.

Metoda update()

W dzisiejszym artykule posługiwać będę się trzema zmiennymi słownikowymi. Zdefiniuje je w poniższy sposób. Zauważmy, że zarówno w zmiennej x jaki i z występuje klucz ‘a’, lecz ma przypisane inne wartości.

>>> x = {'a': 1, 'b': 2}
>>> y = {'c': 3, 'd': 4}
>>> z = {'a': 5, 'f': 6}

Pierwsza metoda łączenia ze sobą dwóch zmiennych typu słownikowego polega na wykorzystaniu metody update(). Gdy wywołamy ją jako metodę zmiennej x jako argument podając zmienną y, to zawartość zmiennej y zostanie doklejona do zmiennej x.

>>> x.update(y)
>>> x
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

W przypadku, gdy nazwy kluczy się powtarzają, wartość klucza w zmiennej, dla której metoda jest uaktualniana zostanie zaktualizowana

>>> x.update(z)
>>> x
{'a': 5, 'b': 2, 'f': 6}

Dlatego ważne jest by dokładnie rozumieć kierunek działania metody update(). Wywołanie jej ze zmiennej z przyniosłoby następujący efekt.

>>> z.update(x)
>>> z
{'a': 1, 'f': 6, 'b': 2}

Łączenie zmiennych operatorami **

Bliźniaczo podobna do powyższej jest metoda operatorów **. Wymaga ona jednak zapisania wyniku operacji w trzeciej zmiennej. Nie modyfikuje ona żadnej ze zmiennych, które łączymy jak to miało miejsce w poprzednim przykładzie. Została ona wprowadzona w wydaniu 3.5 języka Python. Nie jest ona zbyt intuicyjna w swoim zapisie i niewielu programistów z niej korzystało.

>>> u = { **x, **y}
>>> u
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> w = { **x, **z}
>>> w
{'a': 5, 'b': 2, 'f': 6}

Jak widać w przypadku powtarzających się kluczy nadpisana zostanie wartość tego z lewej strony. Zaletą tej metody jest jednak to, że w pojedynczym zapisie możemy połączyć ze sobą wiele zmiennych słownikowych. Operacje łączenia wykonują się od lewej do prawej.

>>> t = { **x, **y, **z}
>>> t
{'a': 5, 'b': 2, 'c': 3, 'd': 4, 'f': 6}

Połączyć dwie zmienne słownikowe możemy jeszcze tworząc trzecią zmienną jawną deklaracją typu, czyli dict(x, **y). Metoda ta działa jednak jedynie w przypadku, gdy wszystkie klucze w słownikach są tekstem.

Operatory w Python 3.9

W Python 3.9 wprowadzono operacje na zmiennych słownikowych za pomocą operatorów union (|) oraz in-place union (|=). Pierwszy z nich jest odpowiednikiem zapisu {**x, **y}.

>>> x | y
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> x | z
{'a': 5, 'b': 2, 'f': 6}
>>> x | y | z
{'a': 5, 'b': 2, 'c': 3, 'd': 4, 'f': 6}

Sam operator | nie modyfikuje wartości żadnej ze zmiennych. Wynik operacji możemy przypisać do nowej zmiennej. Inaczej zachowuje się operator |=, który połączoną wartość zapisuje w zmiennej po lewej stronie wywołania. Jest on zatem odpowiednikiem wywołania metody update().

>>> x |= y
>>> x
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> y
{'c': 3, 'd': 4}

Jak widzisz łączenie zmiennych słownikowych można wykonać na wiele sposobów. Wybierz odpowiedni dla swojego programu. Koniecznie pamiętaj, która metoda nadpisuje wartość jednej z łączonych zmiennych aby nie stracić przetwarzanych danych.