Ik werk nu dagelijks in python en om eerlijk te zijn vind ik het geen goeie taal:
- scope definieren door indendatie. Als je iets als C/C++ gewend bent dan is dit echt een hel. Zeker als je IDE je er dan nog mee plaagt... Probeer maar eens een geneste for-lus met wat if's etc overzichtelijk te houden. in C++ kun je doen:
C++:
1
2
3
4
| for (int i = 0; i<10;i++)
{
//veel code
} // for i=1->10 |
Het is al de eerste keer niet dat door idiote indendatie het programma fout loopt
- loose-typing: Python kent geen types. Het is een beetje
revolutie naar VB met zijn Variant-type. Alles is niks, niks is alles.
- C++ compile-time fouten zijn Python-runtime fouten.
Heb je van een variabele een hoofdletter gemist? staat er een 'a' ipv een 'e'? Je vindt het pas als je je code draait. Dit is enorm tijdrovend om telkens alles te moeten draaien om te zien of je geen idiote typfouten hebt. Bovendien kan dit leiden tot code met onvoorspelbaar gedrag in sommige gevallen... denk maar:
Python:
1
2
3
4
5
| def SomeFunction(a, b, c):
if a:
return b
else:
return d |
als jij bij het testen van je software altijd het geval (a=true) hebt dan zal je nooit zien dat je code fout is.
- Leg aan een beginnende programmeur maar eens het verschil uit tussen parse-time evalutatie en execute-time evaluatie...
Voor zij die het niet begrijpen:
Python:
1
2
3
4
| def SomeFunction(a,b,c):
return a+b+c+d
d = 10 |
Maar H!GHGuY, maak je hier niet dezelfde fout als in je vorig voorbeeld? Nee!
wanneer je deze code importeert(dus wanneer python deze code voor de eerste maal leest) wordt de functie toegekend aan SomeFunction (functies zijn ook variabelen!) en wordt 10 toegekend aan d.
Wanneer je SomeFunction aanroept, is d gedefinieerd als global en kan je deze dus gebruiken...
of erger:
Python:
1
2
3
4
5
6
| def SomeFunction():
global d
d = 10
def SomeOtherFunction()
return d |
Wat gebeurt er als SomeOtherFunction() voor SomeFunction() wordt aangeroepen?
Waar is het principe van "Design by contract" ? Waarom moet ik de implementatie van alles kennen voor ik het kan gebruiken ?
- Hoe kan een taal zich object-oriented noemen als je niet eens encapsulation hebt?
Python:
1
2
3
4
5
6
7
8
| class A:
def __init__():
a = 10
def SomeFunction():
mijnA = A()
mijnA.a = 20
return mijnA |
- Waarom kan je overal een else-clause aanplakken?
Python:
1
2
3
4
5
6
7
8
9
10
11
12
| try:
doeIetsGevaarlijks()
except:
pass
else:
nietsGebeurd()
# is bijna gelijk aan (en minder veilig dan?)
try:
doeIetsGevaarlijk()
nietsGebeurd()
except:
pass |
Er zit een verschil in: bij de eerste is er geen exception handling op nietsGebeurd(), bij de 2de wel.
Ik vind dit soort constructs te erg voor woorden.
Zie ook:
Python:
1
2
3
4
5
6
7
8
9
10
11
| myArray = range(100)
for i in range(len(myArray))
if myArray[i] > 10:
doeIets()
elif myArray[i] > 50:
break
elif myArray[i] > 90:
continue
doeNogIets()
else:
doeNiets() |
Wat is het nut hier nu van... Het maakt je code helemaal onoverzichtelijk en moeilijk te begrijpen.
- Waarom bestaat try: except: en try:finally maar geen try:except:finally:?
- Waarom moet je bij klasse-methoden telkens "self" meegeven ? Zelfs C++ laat dit over aan de compiler...
Dit is een kleine greep uit de dingetjes die mij dagelijks storen. Python werkt imo enorm contraproductief voor iemand die een 'echte' taal gewoon is.
Er heeft ooit iemand gezegd: "moest menselijke taal even strikt zijn als een programmeertaal, mensen zouden nooit nog misverstanden hebben". Python veegt hier dubbel en dik zijn broek aan.
Alles kan, alles mag. Het staat toe om dingen te doen die in normale talen niet kunnen omdat het leidt tot slechte code en het zorgt ervoor dat je de volledige implementatie moet kennen voor je het kan gebruiken.
Het enige waar ik Python nog voor wil gebruiken is om "snel iets in mekaar te klieden". En voor zover ik weet was dat ook de oorspronkelijke bedoeling ervan.
Als je jezelf enigszins serieus wil nemen, leer dan eerst een "strikte" taal en bekijk daarna Python en niet omgekeerd, je zou jezelf wel eens in je aders kunnen snijden door eerst de slechte manieren aan te leren.
Dit is bovendien een welgemeende proficiat aan mensen die ooit een groter project in Python hebben gemaakt. Het doet me denken aan skaters die telkens als ze op hun bek gaan terug opstaan... veel moed hebben ze
Over ruby kan ik helaas weinig zeggen, wegens geen ervaring ermee, maar afgaande op de kritiek van anderen in deze topic zou ik dus maar van beide wegblijven.
En om je dan ook, behalve een rant op python, wat constructieve commentaar mee te geven:
kijk eens naar Java of C# (icm met m0n0). Het zijn de ideale tools voor niet-IT'ers om toch iets mee in mekaar te flansen in een minimum van tijd.