Poziom: 0 | Kategoria: Komputerowo-internetowo, Python, Studia, Techblog.
Można powiedzieć, że dzisiaj światło dzienne ujrzała wersja 0.2 pygglib — biblioteki do obsługi protokołu Gadu-Gadu napisanej w pythonie. Wersja ta implementuje już większą część protokołu opisanego na stronach EKG.
Przy okazji pisania testów i implementacji okazało się, że panowie z Gadu-Gadu znowu mieszają coś w protokole, poza tym opis na stronach EKG jest już trochę nieaktualny (szczegóły zostały wysłane na listę dyskusyjną ekg-devel). W każdym razie dzisiaj miała miejsce prezentacja projektu na zajęciach i muszę przyznać, że większość prac, która została przewidziana, została zaimplementowana. Niestety zabrakło czasu na obsługę bezpośrednich połączeń oraz takich rzeczy jak połączenia konferencyjne, czy rozmowy głosowe, jednak jestem zadowolony z tego, co zostało napisane.
Przy okazji muszę ponarzekać na pythona... Przyzwyczajony byłem do tej pory do składni języka Ruby i trochę trudno było mi się przestawić na wcięcia i dwukropki. Poza tym podobno python jest językiem obiektowym, więc tym bardziej denerwowało mnie na przykład to, że lista nie ma metody "len" bądź "length", tylko jej długość możemy sprawdzić funkcją len(lista), co już, według mnie, za bardzo obiektowe nie jest.
Na osobną notkę zasługuje również coś, co według mnie powinno zostać naprawione wieki temu — w pythonie nie da się (pod Windowsem i w sposób najbardziej naturalny) przechwytywać sygnału SIGINT po wciśnięciu Ctrl+C (czyli wyjątku KeyboardInterrupt) w programach wielowątkowych! Jest to absolutna kompromitacja. W programie demonstrującym działanie pygglib chciałem stworzyć proste echo, które byłoby wyłączane przez wciśnięcie Ctrl+C, jednak, ponieważ biblioteka korzysta z listenera i obsługuje zdarzenia, przez co jest wielowątkowa, stało się to niemożliwe. Pod linuxem można ten błąd w dosyć prosty sposób ominąć poprzez zastosowanie os.fork(), jednak pod Windowsem takiej opcji nie ma.
To tyle narzekania na Pythona. Zainteresowanych zapraszam do pobrania źródeł biblioteki oraz testowania. Ewentualnie błędy i sugestie proszę zgłaszać na Trac projektu.
EDIT: Wypuściliśmy wersję 0.2.1, w której poprawiony został odczyt wiadomości wysyłanych z niektórych wersji Gadu-Gadu, na końcu których występowały czasem śmieci. Link do źródeł został zaktualizowany.
Teraz możesz napisać klienta jabbera, bo freetalk zaczyna mi płatać różne figle.
16 stycznia 2008 o 18:56:23Zawsze możesz zmienić komunikator :-)
16 stycznia 2008 o 18:57:31Zawsze masz metodę len ale funkcja len() jest wygodniejsza.
Co prawda z nowego wątku nie da się przechwycić wyjątku, ale nie widzę takiej potrzeby. Da się to ominąć okrężną drogą korzystając z biblioteki ctypes, poprzez ctypes.pythonapi.PyThreadState_SetAsyncExc.
16 stycznia 2008 o 23:17:50ah ten textile
16 stycznia 2008 o 23:50:50Metoda z podrkeśleniami w nazwie jest zła, przede wszystkim nie jest mnemoniczna. Jeżeli chodzi o przechwytywanie KeyboardInterrupt, to napisałem, że chciałem zamykać aplikację wywołując SIGINT, a przed zamknięciem powinienem się wylogować (wywołać metodę logout), stąd potrzeba przechwytywania wyjątku.
16 stycznia 2008 o 23:54:46nie wiem co rozumiesz przez mnemoniczna ale idea tego jest taka że len miało być przeładowaniem operatora, tak jak np add
nie wiem bardzo o co chodzi ale KeyboardInterrupt zawsze można złapać w głównym wątku
17 stycznia 2008 o 01:32:25Właśnie o to chodzi, że nie da się w głównym wątku przechwycić KeyboardInterrupt, to jest bug, który nie wiem kiedy zostanie naprawiony.
17 stycznia 2008 o 10:10:33Natomiast jeżeli chodzi o mniemoniczną ideę, to chyba bardziej naturalnym jest wywołanie lista.length(), ewentualnie lista.length niż len(list) lub lista.__len__(). Nie twierdzę, że nie można się do tego przyzwyczaić, piszę tylko, że moim skromnym zdaniem takie rozwiązanie jest nienaturalne.
GhandaL, a naturalne jest lista5, albo slownik[‘cos’]? Czy moze powinno byc list.get(5), slownik.get(‘cos’)?
17 stycznia 2008 o 11:52:21Textile czasem nie jest fajne :-/ Mialo byc lista [ 5 ] – mam nadzieje, ze tutaj sie nie zrobi odnośnik ;)
17 stycznia 2008 o 11:54:30Cinu, wiesz, o co mi chodzi (mam nadzieję). A słownik, czy tablia (lista) z indeksem/kluczem w [] jest jak najbardziej naturalna.
17 stycznia 2008 o 12:26:49Wiem o co Ci chodzi. Oczywiście zgadzam się z Tobą, że [] jest naturalne. Ale czym takim się różni len(lista) od lista[‘cos’] z punktu widzenia „wizualnej” obiektowości? Niczym. Różnica polega jedynie na tym, że lista[‘cos’] jest bardzo powszechne, a len(lista) nie. Jesteś przyzwyczajony do konstrukcji [], dlatego nie przeszkadza Ci to, że nie jest „wizualnie” obiektowa.
17 stycznia 2008 o 23:40:13Tym się różni, że pisząc lista[‘cos’] widać od razu, że wywołujesz metodę [] na obiekcie lista (modulo kropka po nazwie obiektu). Wywołując len(lista) aplikujesz jakąś funkcję (niewiadomo skąd) z zewnąrz do obiektu lista. To nie jest czysto obiektowe według mnie i trochę kłóci się z ideą obiektowości (Smalltalkową, gdzie wszystko jest obiektem).
18 stycznia 2008 o 01:03:08A obsługa obrazków będzie?
10 sierpnia 2008 o 16:22:29Pygglib bardzo przydatna , ale mam mały problem zostawiłem URL :D Byłbym wdzięczny za pomoc
28 czerwca 2009 o 12:04:55