Nienawidzę Pythona

W nazwie języka Python wbrew pozorom nie chodzi wcale o węża, a o komedię z lat 70 - Latający cyrk Monty Pythona. Myślę, że to najlepiej podsumowuje ten język. A teraz do rzeczy.

Python to język używany wszędzie, w prostych skryptach automatyzujących nudne i powtarzalne czynności, na serwerach, do trenowania sieci neuronowych, w bardziej skomplikowanych aplikacjach i nawet grach. Język banalny do opanowania / zrozumienia dla każdego początkującego programisty i chyba to jest jego największą wadą.

Python to język który przez swoją “prostotę” porzuca utarte i powszechnie znane schematy ze świata programowania, robi wszystko po swojemu i nie za bardzo mu to wychodzi. Ta “prostota” Pythona na pewno jest potrzebna i mile widziana w prostych projektach takich jak wspomniana skryptowa automatyzacja akcji, jednak do bardziej ambitnych projektów zupełnie się nie nadaje.

Głupie upraszczanie na siłę

Chyba jednym z głupszych pomysłów Pythona jest ograniczanie programisty narzucaniem mu w jaki sposób ma formatować swój kod. Jeśli nie sformatujemy kodu w taki sposób jak życzy sobie Python, kod w ogóle się nie uruchomi. (narzędzie dyktuje nam sposób jego używania)

Python rozumie wcięcia w kodzie jak powszechnie używane wąsacze { }.

Przykład funkcji z wąsaczami w JavaScript

function foo() {
    // tutaj możemy dać tyle tabów, ile dusza zapragnie.
    // w każdym innym miejscu zresztą też
}

Jeśli używacie tabów (zamiast obrzydliwych spacji) - brak jednego taba sprawi, że kod zupełnie nie zadziała. Nie stanowi to lecz aż tak dużego problemu, gdyż łatwo jest to zauważyć, taby są całkiem szerokie.

Problem zaczyna się kiedy lubimy nasz kod obciążać dodatkowymi znakami a do intendacji używamy spacji, wtedy niełatwo jest szybko przelecieć oczami po kodzie, żeby dowiedzieć się, gdzie leży błąd. Jeśli jednak już go wykryjemy (bo powie nam o tym interpreter przy uruchomieniu kodu), trzeba walczyć z topornym IDE które przy naciśnięciu taba wstawi kompletnie nieodpowiednią ilość spacji, a usunięcie jednej usunie nam 4.

To zadziała

def helloworld():
    print("Witaj")
    print("świecie!")

helloworld()

To już nie

def helloworld():
   print("Witaj")
    print("świecie!")

helloworld()

Wychodzi na to, że “prostota” wcale nie jest taka dobra, jak by się mogło wydawać.

Python jest inwalidą

Python sam niewiele potrafi zdziałać. Żeby zrobić więcej niż wypisać “hello world” w terminalu trzeba bawić się w importowanie masy różnych bibliotek niestety często zarządzanymi przez społeczność.

Nie ma nic złego w bibliotekach zarządzanymi przez wolontariuszy z internetu, problemem jest natomiast ich stabilność. Jedna biblioteka działa na linuksie, druga na windowsie, niektóre i tu i tu a niektóre wcale.

Biblioteki często korzystają też z innych bibliotek. Robi się nam dzięki temu łańcuch, którego przerwanie skutkuje wysypaniem się całego programu a naprawienie tego jest męczące, bo trzeba wymienić bibliotekę która nie działa, zmienić ją na coś działającego podobnie (może nawet gorzej) i przepisać kod który jej używał często idąc na kompromisy.

Zazwyczaj skrypty napisane w Pythonie trzymają swoje zależności w pliku requirements.txt, dzięki czemu instalacja ich może odbyć się szybko, za pomocą jednej komendy, jeśli nie daj boże nic się nie wysypie.

Jeśli jednak coś postanowi nie zadziałać, mamy problem. I ja miałem, wiele razy, kiedy chciałem użyć tego języka korzystając z czyjegoś kodu. Pytorch, PyAudio, rzygać się na to wszystko chce, z żadnym innym językiem nie miałem takich problemów.

Warto dodać jeszcze, że biblioteki w Pythonie czesto pisane sa w C lub pochodnych jezyka C, bo napisanie ich w Pythonie byloby za trudne i czasochlonne, przyklad: NumPy.

Interfejsy użytkownika

Kiedyś sam próbowalem stworzyć w Pythonie coś użytecznego - udało mi się.

do pewnego stopnia

kiedy mam już napisaną całą logikę skryptu - chciałbym mieć do niego ładny interfejs, żeby mój “program” był przystepniejszy dla przeciętnego użytkownika.

Próba stworzenia nawet najprostszego interfejsu pokazuje, że Python wcale nie był stworzony do takich rzeczy. Oczywiście pierwsze co należy zrobić to pobrać kolejne megabajty biblioteki zarządzanej przez społeczność, bo nie da się tego zrobić w inny sposób. jak się okazuje Tkinter jest standardową biblioteką Pythona, wspaniale!

Tkinter - tak nazywała się biblioteka, która wybrałem. była najpopularniejsza (ale i tak mało popularna, te biblioteki zdają się być niechętnie używane przez użytkowników Pythona) i zdawała się mieć najlepsze, najaktywniejsze community.

Tak wygląda zegarek napisany za pomocą tkintera:

from tkinter import *
import time

class App(Frame):
    def __init__(self,master=Nonę):
        Frame.__init__(self, master)
        self.master = master
        self.label = Label(text="", fg="Red", font=("Helvetica", 18))
        self.label.place(x=50,y=80)
        self.update_clock()

    def update_clock(self):
        now = time.strftime("%H:%M:%S")
        self.label.configure(text=now)
        self.after(1000, self.update_clock)

root = Tk()
app=App(root)
root.wm_title("Tkinter clock")
root.geometry("200x200")
root.after(1000, app.update_clock)
root.mainloop()

Jak na język który “stawia na przejrzystość i czytelność kodu” nie za dobrze mu to idzie.

W C#, interfejs możemy szybciutko wyklikać, a kod zegara wyglądałby tak:

private void timer1_Tick(object sender, EventArgs e)
{
    label1.Text = DateTime.Now.ToString("HH:mm:ss");
}

Według tego poradnika wystarczy zmienić jedną wartość, żeby zegar odświeżał się w czasie rzeczywistym.

Problemem z interfejsami w Pythonie jest to, że tworzymy je za pomocą Pythona, który przecież nie był do tego stworzony. W C# mamy od tego XML.

Gamedev

Ludzie tworzą gry w Pythonie. Dla mnie byłoby to jak bawienie się z ezoterycznym językiem programowania, ale jak się okazuje inni mają tak samo. Wystarczy spojrzeć na projekty gier, które powstają w Pythonie. Agar.io na single player gdzie nawet kamera nie porusza się za graczem? W Pythonie to łatwizna. Minecraft w tydzień? Pewnie. Snake? W Pygame to bułka z masłem.

Niektórzy wyznaczają sobie cele, żeby w tym topornym języku jak najszybciej zrobić coś trudnego, dosłownie jak z każdym innym językiem, który nie został przystosowany do tego, co chcą osiągnąć. Nie potrafię znaleźć żadnej dobrej/popularnej (nie mylić ze sobą tych pojęć) gry napisanej w Pythonie, oprócz snake’a. Udało mi się jedynie natrafić na informację, że Battlefield 2 używa Pythona.

Do swoich serwerów. (i dodatków jak się okazuje)

Wyciąganie prostego języka skryptowego do takich zadań - kiedy nie potrafi on sobie normalnie poradzić nawet ze stworzeniem prostego interfeju nie może skończyć się dobrze. No i się nie kończy, bo przeważnie nie zaczyna się wcale.

Na koniec

Python to język szalenie niezrozumiany właśnie przez jego prostotę i przystępność dla początkujących koderów, którzy wciskają go na siłę gdzie się da. Wiadomo, że nowy koder nie będzie się uczył innego języka, jeśli umie już napisać “hello world” w Pythonie. Ta wiedza nie może przecież pójść na marne.

Tragedia Pythona leży w jego głupich uproszczeniach i w tym, jak dużo amatorów pcha się do zabawy.

Ale przecież wszystko może być młotkiem, no nie?


Jeśli interesuje Cię więcej powodów, by nienawidzić tego języka, zerknij tutaj, albo tutaj

Oryginalna data napisania artykułu: 08.05.2022 Ostatnio modyfikowany: 11.05.2022