Kategorie
Python

Operatory porównania: „is” kontra „==”


Czytniki e-book - sprawdź na Ceneo


Jaka jest różnica pomiędzy == oraz is. Zróbmy mały teścik.

Wynik powyższego snippetu nie jest zaskakujący.

b i a wskazują na ten sam obiekt w pamięci, zatem każda zmiana w a lub b dokonywana jest na tym samym obiekcie. Dlatego też a is b oraz a == b zwracają True.

Lista c jest nowym obiektem stworzonym z kopii a. Wskazuje na inny obszar pamięci zatem a is c zwraca False. Ponieważ a i c mają taka samą zawartość a == c zwraca True. Podsumowując kolokwialnie można stwierdzić, że operator == sprawdza czy obiekty sa takie same, natomiast operator is czy obiekty są identyczne(lub czy obiekt jest tym samym obiektem).


Czytniki e-book - sprawdź na Ceneo


Kategorie
Python

Parametry opcjonalne: *args, **kwargs


 


Funkcje napisane w języku Python mają możliwość akceptowania opcjonalnych parametrów. Przyjrzyjmy się poniższemu snippetowi.

Jeżeli wywołamy tę funkcję w następujący sposób:

Otrzymamy następujący wynik:

Argumenty pozycyjne zostały skumulowane w tuplu *args, a argumenty nazwane w słowniku **kwargs. Co się stanie gdy wywołamy tę funkcję bez argumentów:

Nic się nie wydarzyło, błędu też nie ma. Więc argumenty *args i **kwargs nie są wymagane. Dodajmy dodatkowy argument arg_1 i wywołajmy tę funkcję z poprzednimi argumentami.

Z tupla *args znikneła nam 1. Wypiszmy brakujący arg_1 i wywołajmy funkcję jeszcze raz.

Co się stanie jak wywołamy funkcję bez argumentów?

No tak arg_1 jest wymagany. Potestujmy tę funkcję i zobaczmy do jakich dojdziemy wniosków.

A więc w Pythonie istotna jest kolejność argumentów pierwszy od lewej przypisany jest do arg_1 kolejne pozycyjne są umieszczane w tuplu *args a argumenty nazwane są kumulowane w słowniku **kwargs. Jeżeli odwrócimy w jakiś sposób kolejność argumentów zostanie zwrócony SyntaxError. Warto wspomnieć, że nazwy *args oraz **kwargs to tylko przyjęta konwencja równie dobrze możesz użyć *positional_arguments, **named_arguments. Ważne aby zapamiętać, że prefix * oznacza tuple a prefix ** słownik.

 


Podzespoły na Ceneo.pl


Kategorie
Bugi

Bug w module Makler Banku ING

Kupiłem pakiet akcji PGNIG (niestety jak były na górce). Posiadam konto maklerskie w Banku ING i często korzystam z modułu Makler. 23 grudnia 2019 to ostatni dzień w którym można „rozliczyć” bieżący rok, wiec podejrzewałem, że „ostatni będzie gasił światło”. W piątek 20 grudnia w dogrywce pojawiła sie bardzo duża tranzakcja ponad 15mln sztuk akcji czyli jakies ~63mln zł. Moduł Makler zwariował 🙂 Widget z tranzakcjami „sypał” tysiącem tranzakcji po 15mln sztuk a wykresy liniowy i świeczkowy miały błedne wartości.

Oczywiście zgłosiłem to do ING zobaczymy czy doczekam się odpowiedzi. W każdym bądź razie nie tak powinny działać widgety bankowości online

Bug w module Makler Banku ING Bug w module Makler Banku ING Bug w module Makler


Bug w module Makler


Bug w module Makler

Update: Otrzymałem info z biura maklerskiego, że zgłoszenie zostało przekazane specjalistom od oprogramowania.

Podzespoły na Ceneo.pl

Kategorie
Bugi

Bug w frameworku Qt

 


Niedawno znalazłem małego buga w frameworku Qt 5.13.0 w pluginie qtserialbus. W momencie gdy klient wysyłał sygnał disconnect do serwera, serwer nie obsługiwał tego sygnału a więc client tak naprawdę nie był rozłączany. W następstwie tego każda kolejna próba połączenia kończyła się niepowodzeniem. Zgłosiłem znajdkę autorowi pluginu i po małej wymianie mejli otrzymałem taką odpowiedż


Hi Piotr

thanks again for your report.

I was finally able to reproduce it. The reason there is no problem with the CAN example is, that there the device is not properly disconnected but rather deleted. Every new connection creates a new device so I didn’t see your bug.

Anyway, the fix is here:

https://codereview.qt-project.org/c/qt/qtserialbus/+/280863

It will go into Qt 5.14.0 hopefully, which is expected quite soon.

If you could test the patch on your machine (by building qtserialbus from source) or at least the next 5.14 snapshot after the patch is merged, that would be super helpful.

Thanks and best regards,

Andre


Nieskromnie się tym chwalę 🙂

Podzespoły na Ceneo.pl

Kategorie
Python

Lambda : Anonimowe funkcje w Pythonie


 


W języku Python lambda jest słowem kluczowym dzięki któremu możemy deklarować funkcje anonimowe. W poprzednich wpisach wykorzystałem domknięcia i callable do obliczania potęgi, w przypadku lambdy może to wyglądać tak

Lambdy można domknąć

Lambda możne również zwrócić lambdę. Jest to karkołomna konstrukcja ale jak najbardziej prawidłowo działająca

Kiedy stosować lambdę? Np. w metodach map, filter, reduce i innych przyjmujących funkcję lub wtedy gdy tą funkcję wykonujemy tylko raz.


Podzespoły na Ceneo.pl


Kategorie
Python

Callable: Obiekt który zachowuje się jak funkcja


 

 


W języku Python wszystkie funkcje są obiektami, ale na odwrót już nie. Jednak Python oferuje nam możliwość traktowania obiektów jak funkcję. Aby instancja klasy stała się takim obiektem wystarczy stworzyć metodę __call__. W poprzednim wpisie pokazałem jak wykorzystać domknięcie do obliczenia potęgi danej liczby. Tym razem, do tego samego celu użyjemy obiektu callable.

A teraz stworzymy kilka obiektów i wywołamy je jako funkcje.

Elegancko ! Mamy teraz obiekt który możemy wywoływać jak funkcję. Zapraszam Cię do porównania dzisiejszego postu z poprzednim wpisem


Podzespoły na Ceneo.pl


Kategorie
Python

Closures: domknięcia leksykalne


 

 


Przyjrzyjmy się poniższemu snieppetowi. Funkcja power_of zwraca nam wewnętrzną funkcję power

Zagnieżdżona funkcja power nie posiada parametru base zdefiniowanego przez funkcję nadrzędną. Jednak w jakiś sposób ma do tego argumentu dostęp. Wywołajmy tą funkcję i zobaczmy co się stanie

MAGIC!!. W jakiś sposób funkcja power pamięta wartość argumentu przekazanego do funkcji nadrzędnej. Odpowiada za to tzw. domknięcie (ang. lexical closures). W chwili gdy funkcje power_of… były deklarowane, domknięcie zapamietało środowisko leksykalne w jakim były one tworzone.
Odpowiednikiem powyższych domknięć mogą być następujące funkcje:

Jak widzisz dzięki domknięciom możemy pre-konfigurować zachowanie funkcji, oszczędzić czas i ilość kodu, a im mniej kodu tym mniej błedów 🙂


Podzespoły na Ceneo.pl


Kategorie
Python

Sortowanie listy słowników po kluczu który może nie istnieć.


 


Przypuśćmy, że chcielibyśmy posortować listę słowników wg klucza. Jeżeli mamy szczęście i dany klucz występuje we wszystkich słownikach zadanie jest proste.

W rezultacie otrzymujemy

Niestety powyższy snippet nie działa gdy w naszym słowniku nie ma danego klucza. jak zapewne wiesz w takim wypadku interpreter podniesie wyjątek KeyError

Wynik

Najprostrzym rozwiązaniem tego problemu jest użycie metody get(). W przypadku braku klucza nie podniesie wyjątku tylko zwróci None

Boom coś poszło nie tak 🙁

No tak, próbujemy użyć operatora porównania dla typu None i int: None < int

Z pomocą przyjdzie nam mała magia. Wystarczy, że nasza lambda zwróci tuple z dwoma wartościami

Pierwszy element to boolean a drugi wartość pod danym kluczem lub None w przypadku braku klucza.

Ponieważ False(0) jest przed True(1) dlatego użyte zostało „not in”

Zadanie wykonane. Słowniki są posortowane wg klucza który w innych słownikach nie istnieje.

Po usunięciu operatora NOT (w Pythonie True > False)

Otrzymamy


Podzespoły na Ceneo.pl