Dos and Don'ts

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Haus

Eine Programmiersprache zu erlernen besteht meiner Meinung nach aus mehreren Schritten. Zu Beginn muss man z.B. über Tutorials oder Lehrbücher die Basics und die Syntax einer Sprache lernen (dies habe ich vor kurzem bzgl. Python getan). Nachdem man die Basics jedoch verinnerlicht hat, sollte man auch lernen mit der Sprache möglichst gut umzugehen und die Konzepte der Sprache bestmöglich zu verinnerlichen. So kann man z.B. in C++ sicherlich auf Container der STL verzichten, aber man kann sie auch nutzen, um nicht immer wieder das Rad selbst zu erfinden und Probleme zu vermeiden (ein weiteres, evtl. gar besseres Beispiel wäre auch der Einsatz von Smart Pointern zur Speicherleckvermeidung). Mich persönlich würden Dos und Don'ts bzgl. Python interessieren, welche selten bis gar nicht in den Lehrbüchern oder Tutorials stehen (man sammelt sie so über die Jahre natürlich durch eigene Arbeiten und Recherchen auf, aber ich persönlich würde gerne den Wissensgewinn über diesen Thread ein wenig beschleunigen). Ich habe z.B. schon gelesen, dass man mit dem Import-Befehl "import ... from ..." vorsichtig umgehen sollte. Welche Dos und Don'ts bzgl. Python gibt es denn noch, so dass ich zukünftig besseren Python Code schreibe?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

the more they change the more they stay the same
Benutzeravatar
Kebap
User
Beiträge: 691
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Code: Alles auswählen

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
pillmuncher
User
Beiträge: 1485
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
pillmuncher
User
Beiträge: 1485
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Noch was: __init__() ist kein Constructor. Es ist, wie der Name schon andeutet, ein Initializer. Der Konstruktions-Prozess erfolgt in Python in zwei Schritten: erst wird die Klassenfunktion __new__() aufgerufen, die das gewünschte Objekt erzeugt, und danach __init__(), sofern das Ergebnis von __new__() ein Objekt der Klasse ist, deren __new__() aufgerufen wurde. Beispiel:

Code: Alles auswählen

>>> class A(object):
...     def __new__(cls, x):
...         if x < 0:
...             raise ValueError('x must be >= 0')
...         return object.__new__(cls)
...     def __init__(self, x):
...         self.x = x
...
>>> class B(object):
...     def __new__(cls, x):
...         return x
...     def __init__(self, x):
...         print 'never here!'
...
>>> a = A(7)
>>> a.x
7
>>> b = B(7)
>>> b
7
Desweiteren ist die Methode __del__() auch kein Destructor. So etwas gibt es in Python überhaupt nicht. Und immer, wenn du glaubst, dass du __del__() brauchst, bist du im Irrtum. Wer es nämlich wirklich braucht, der glaubt das nicht nur, sondern weiß es. Insbesondere braucht man es nicht, um Speicher freizugeben. Manchmal führt die Verwendung von __del__() sogar dazu, dass der Speicher, den das Objekt belegt, überhaupt nicht freigegeben wird. Und die Dokumentation zu __del__() sagt ganz klar, dass es - sofern vorhanden - immer am Ende des Lebens eines Objekts automatisch vom Garbage Collector aufgerufen wird, außer, er ruft es nicht auf. :shock: Python ist also auch nicht C++.
In specifications, Murphy's Law supersedes Ohm's.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Haus hat geschrieben:Ich habe z.B. schon gelesen, dass man mit dem Import-Befehl "import ... from ..." vorsichtig umgehen sollte.
Naja. das finde ich nicht so schlimm. Wenn man Sternchen-Importe macht, ist das natürlich was anderes.

Achja, ein beliebtes Antipattern was ich öfter sehe ist über Listen zu itereieren und sie zu verändern. In Python legt man bei sowas üblicherweise neue Liste mit neuen Elementen an und verwirft die alten Listen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
deets

Und wo wir dabei sind - auch Zugriffe ueber Indizes sind verpoent. Auch wenn ein ehemaliges Forumsmitglied das nicht so recht wahr haben wollte (RIP, problematischer Baer...)
Antworten