Editor für Amateur-Quereinsteiger

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.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

Hallo,

ich bin ein fortgeschrittener Amateur-VBA-Programmierer (ich habe da schon OOP-Anwendungen mit > 10000 Zeilen Code geschrieben), allerdings möchte ich in Zukunft plattformunabhängig arbeiten, und habe mich deswegen nach einigen Recherchen dazu entschlossen Python zu lernen. Auf ein vielversprechendes Tutorial (Galileo-Computing) bin ich auch schon gestoßen, auch auf mehrere Editoren, allerdings mangelt es mir da noch etwas an der Übersicht, um mich zu entscheiden.

Im Moment arbeite ich mit Windows 7 64bit (ich weiß, das ist zum Programmieren generell nicht so ideal, aber ich habe leider ein paar Anwendungen, die auf eine 64bit-Umgebung angewiesen sind)

Jetzt meine Frage: Gibt es einen Freeware-Editor, der in dieser Betriebssystemumgebung einwandfrei funktioniert, und der es mir auch erlaubt den Code zu testen und zu Debuggen? (Einzelschritt, Überwachung etc.) Außerdem, falls es Editoren geben sollte, die das nicht unterstützen, Objektorientierung wäre schon sehr wichtig.

Hilfe wär lieb

LG SG ;-)
Me.PEBKAC ^^
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo und Willkommen im Forum!
SG ;-) hat geschrieben: Auf ein vielversprechendes Tutorial (Galileo-Computing) bin ich auch schon gestoßen,...
Das ist schon mal schlecht, denn dieses enthält viele sachliche Fehler. Mehr dazu findest Du schnell über die Suche :-) Der Tipp der Regulars hier: Dieses nicht verwenden!
SG ;-) hat geschrieben: Jetzt meine Frage: Gibt es einen Freeware-Editor, der in dieser Betriebssystemumgebung einwandfrei funktioniert, und der es mir auch erlaubt den Code zu testen und zu Debuggen? (Einzelschritt, Überwachung etc.) Außerdem, falls es Editoren geben sollte, die das nicht unterstützen, Objektorientierung wäre schon sehr wichtig.
Hast Du schon unseren Thread über Editoren durchgelesen? Da solltest Du alles wissenswerte finden :-)

Was "Objektorientierung" allerdings mit Editoren zu tun hat, ist mir rätselhaft...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

Hallo Hyperion,

danke erstmal für die schnelle Hilfe, ich habe mir jetzt SciTE runtergeladen, und werde versuchen damit zurechtzukommen.

Was ein Tutorial anbelangt, da habe ich natürlich keine Ahnung, welches da zum einen fehlerfrei sein könnte, und zum anderen geeignet ist, einem Umsteiger wie mir die Syntax schnellstmöglich zu vermitteln. Ich hab jetzt hier auf der Seite ein bisschen herumgeguckt und bin darauf gestoßen:

https://bitbucket.org/cofi/py-tutorial- ... -04-28.pdf

ich hoffe, das ist eher zu empfehlen, als das von Galilieo-Computing.

LG SG ;-)
Me.PEBKAC ^^
BlackJack

@SG ;-): Das ist eine deutsche Übersetzung des Tutorials aus der Python-Dokumentation.

Einzelschritt-Debugger benutze ich in Python sehr selten, wenn dann PDB aus der Standardbibliothek oder WinPDB als grafische Variante. Der ist unabhängig von Editor oder IDE.

Aber in der Regel braucht man keine Einzelschrittausführung wenn man einfach testbaren Code schreibt. Ein paar ``print`` um zu prüfen ob bestimmte Namen den Wert haben, den man an der Stelle vermutet, reichen in der Regel völlig aus. Bei vielen Funktionen wüsste ich nicht mal wo ich einen Breakpoint setzen sollte, weil die ganzen Schleifen die man in anderen Programmiersprachen verwendet/verwenden muss in Funktionsaufrufen oder Generator-Ausdrücken und „list comprehensions” stecken. Wenn man so viele Namen, verschachtelte Schleifen und ``if``-Anweisungen in einer Funktion hat, dass man den Überblick verliert und da in Einzelschritten durchgehen muss, dann sollte man in der Regel den Code umschreiben.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

@Blackjack

Ah ok,

da muss ich wohl noch einiges lernen, bevor ich mich umgewöhne^^
Ich kenn das aus dem VBE halt, dass man Schleifen, Subs und Functions, auch Propertys mit einer Tastenkombination in einem Schritt abbarbeiten kann. Dadurch wirds dann auch bei verschachteltem Code wieder übesichtlich.

Hat den Vorteil gegenüber print, dass man ziemlich leicht auch Bugs aufstöbern kann, von denen man nicht so genau weiß, in welcher Prozedur sie sitzen, bzw. in welchem Event. (zumindest in VBA wird print (da: Debug.Print) ja immer nur in der Prozedur abgearbeitet, in der es auch steht. Und wenn es z.B. in einem Property_Set knallt, dann weiß ich ja normalerweise nicht, auss welcher Prozedur der fehlerhafte Aufruf kam.

Ich guck mir grade noch den Wingware Python IDE an. Sieht im Vergleich zu SciTE ziemlich schick aus (kostet halt auch was) aber erinnert mich ein bisschen an den VBE von den Features her. Ich nehme mal an, so etwas in der Art gibt es nicht als Freeware?

LG SG ;-)
Me.PEBKAC ^^
BlackJack

@SG ;-): Wenn es irgendwo ”knallt” bekommt man bei Python ohne irgendetwas tun zu müssen einen kompletten Traceback ausgegeben. Suchen muss man also eigentlich nur bei Fehlern die nicht ”knallen” sondern problemlos laufen aber nicht das richtige Ergebnis liefern. Und dafür schreibt man testbaren Code, also Funktionen die man einfach mal isoliert mit Testwerten aufrufen kann um zu sehen ob das richtige Ergebnis heraus kommt. So findet man dann schnell solche bei denen *nicht* das richtige Ergebnis heraus kommt. Und warum dass dann bei einer fehlerhaften Funktion der Fall ist, sieht man entweder am Code, oder ein paar ``print``\s zeigen wo die Werte falsch sind. Wenn man dazu Einzelschrittausführung braucht, ist das wie gesagt, meistens ein deutliches Zeichen, dass man die Funktion anders schreiben sollte.

Verschachtelten Code macht man nicht durch Einzelschrittausführung übersichtlich sondern in dem man keinen verschachtelten Code schreibt. Das ist viel besser.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

Ok, Danke nochmal,

ich seh schon, ich sollte erst einmal ein bisschen mit dem Tutorial herumprobieren, bevor ich hier weiter dumme Fragen stelle^^
Aber das mit dem Traceback klingt schon mal ziemlich gut.

Thx SG ;-)
Me.PEBKAC ^^
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Auch ein "Willkommen im Forum" meinerseits!

Ein wenig habe ich das Gefuehl, dass du genauso weitermachen willst wie bisher, d.h. VBA in Python-Syntax schreiben willst.
Davon solltest du dich frei machen. Das sind zwei verschiedene Sprachen und sie werden auch anders benutzt.
Was BlackJack noch ausgelassen hat sind Unit Tests, damit kann man dann automatisiert die einzelnen Funktionen testen und man entfernt sich noch ein Stueck weiter von Debugging wie du es beschreibst ;)

Zur IDE gibt es noch PyCharm: http://www.jetbrains.com/pycharm/
Aber viele Pythonistas benutzen keine IDEs sondern einen "einfachen" Editor (Emacs, Vim, Sublime, ...) und haben zusaetzlich noch einen interaktiven Interpreter offen.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

Hallo cofi,

da hast Du sicher nicht ganz unrecht:
cofi hat geschrieben:Ein wenig habe ich das Gefuehl, dass du genauso weitermachen willst wie bisher, d.h. VBA in Python-Syntax schreiben willst.
(zumindest dahingehend, dass ich mir über das Bekannte einen Weg in das Neue zu bahnen suche) Und ich bin halt vom VBE so Sachen wie Intellisense und so etwas gewohnt. Aber man kann sich ja auch umgewöhnen. Jetzt muss ich erstmal die Syntax halbwegs durchdringen, und ein paar kleine Übungen schreiben. Ich meld mich, wenn ich nicht mehr weiterkomme :)

Thx & LG SG ;-)
Me.PEBKAC ^^
BlackJack

@SG ;-): Es ging dabei weniger um die IDE oder den Editor sondern eher um die idiomatische Verwendung der Sprache. Da kann einem ein Editor eigentlich nicht bei helfen. Also das man in Python sehr selten Indexvariablen verwendet um auf Elemente von zum Beispiel Listen zuzugreifen, das man Listen dynamisch erstellt und nicht erst einmal eine Liste mit einer bestimmten Länge und ”Dummy”-Werten erstellt und die dann der Reihe nach durch den jeweiligen tatsächlichen Wert ersetzt, das man eher neue Listen erstellt als bestehende zu verändern, Sprachkonstrukte wie „list comprehension”, Generatorausdrücke und -funktionen, Kontextmanager mit ``with``, Ausnahmen statt ``On Error Goto``/``Resume``, und so weiter.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

@BlackJack

Ja, das mit den Listen ist in der Form Neuland für mich. Hab grade im Tutorial darüber gelesen, aber es noch nicht vollständig verstanden. Die Möglichkeiten sind auf alle Fälle sehr vielfältig und interessant, aber adhoc fällt mir jetzt kein praktisches Beispiel ein, in dem ich die Verwendung einer solchen Liste favorisieren würde. Was ich außerdem nicht so recht verstehe, ist, warum man eher neue Listen erstellt, als eine Bestehende zu verändern. Damit produziert man doch im ungünstigsten Fall tausende von Garbage-Listen?^^ Im übrigen erinnern mich diese Listen etwas an Types, wie man sie beispielsweise zur Übergabe von Daten an Minidatenbanken verwendet.
Auch Else in Schleifen kommt mir noch etwas exotisch vor.^^
Aber jetzt muss ich weiterlesen. Ich hab noch einige Seiten bis zu den Klassen und Standardbibliotheken vor mir, und da bin ich schon sehr gespannt, wie das hier geht. :)

LG SG ;-)
Me.PEBKAC ^^
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

SG ;-) hat geschrieben: Ja, das mit den Listen ist in der Form Neuland für mich
Äh.. Du meinst wirklich diese Listen? Oha... wenn Dir so grundlegende Container neu sind, hast Du wirklich einiges aufzuholen :mrgreen: Gibt es in VB denn keine Container / Collections? Würde mich ja irgend wie stark wundern...

Und solche Datenstrukturen bilden das Rückgrat in quasi allen mir bekannten Sprachen! Offenbar sind sie also sehr nützlich :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@SG ;-): Wenn Dir kein Beispiel einfällt in dem Du eine Liste favorisieren würdest, stellt sich die Frage gegenüber welchem anderen Datentyp? Die Liste ist in Python *der* Grunddatentyp für sequenzielle Datenstrukturen (abgesehen von Tupeln in spezielleren Fällen). Das ist das was in BASIC ein Array ist. Arrays gibt's in Python nicht, beziehungsweise nur in spezialisierten Formen wie zum Beispiel der Arraytyp aus dem Numpy-Paket.

In der Regel ist es einfacher und lesbarer eine neue Liste zu erstellen als Elemente in einer bestehenden auszutauschen oder zu löschen. Zum Beispiel alle Elemente einer Liste mit einer Zahl multiplizieren:

Code: Alles auswählen

    a_list = [x * 2 for x in a_list]
    # statt:
    for i in xrange(len(a_list)):
        a_list[i] *= 2
Wenn man alle Werte in eine Funktion stecken und durch den Rückgabewert ersetzen möchte:

Code: Alles auswählen

    a_list = map(a_function, a_list)
    # statt:
    for i in xrange(len(a_list)):
        a_list[i] = a_function(a_list[i])
Wenn man Elemente löschen möchte wird es noch ein wenig komplizierter weil man aus einer Liste über die man gerade iteriert keine Elemente löschen darf, weil dann welche übersprungen werden dadurch das beim entfernen alle Folgeelemente einen Platz nach vorne rücken. Man muss also mit einem Index von hinten anfangen. Und auch das ist dann potentiell immer noch ineffizienter als einfach eine neue Liste zu erstellen weil ja bei jedem gelöschten Element immer alle danach einmal angefasst und verschoben werden:

Code: Alles auswählen

    a_list = [x for x in a_list if x >= 0]
    # statt:
    for i in reversed(xrange(len(a_list))):
        if a_list[i] < 0:
            a_list.pop(i)
Die „tausende von Garbage-Listen” fallen nicht wirklich ins Gewicht. Denn für die Alternative erzeugt man halt genau so viele `xrange`-Objekte die nach der Schleife auch ”Müll” sind. Darum kümmert sich die automatische Speicherbereinigung. Und wenn man Zwischenergebnisse nicht tatsächlich als Listen braucht, dann erstellt man einen Generator der keine ganze Liste erzeugt und füllt sondern die einzelnen Elemente erst dann erzeugt wenn sie abgefragt werden.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

@Hyperion

Doch, natürlich gibt es da Collections und Arrays, allerdings scheinen die in VBA etwas anderen Gesetzmäßigkeiten zu unterliegen als in Python, wenn ich das bis jetzt richtig verstanden habe. Und generell arbeite ich lieber mit Collections, da sich da eher die Möglichkeit bietet das ganze vernünftig zu kapseln, und man den Collections eben auch Methoden und Objekte hinzufügen kann. Das ist mir hier noch nicht so ganz klar, wie das funktioniert. Diese Listen scheinen weder Arrays noch Klassen im üblichen Sinne (abgesehen davon, dass sie natürlich eine eigene Klasse bilden), sondern irgendwas dazwischen. Das finde ich im Moment noch relativv schwammig iwie. Aber ich muss mich vermutlich einfach noch weiter reinlesen^^ :D

LG SG ;-)
Me.PEBKAC ^^
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

@BlackJack

Ah jetzt verstehe ich. Eine neue Liste anlegen heißt also, die alte einfach überschreiben. Das ist natürlich etwas anderes. Ich hatte jetzt das etwas seltsame Bild im Kopf, zur Laufzeit per Code eine neue Liste unter anderem Namen generieren zu müssen, und dann die geänderten Werte an diese neue Liste zu übergeben. Das wär mir jetzt schon sehr umständlich vorgekommen^^ :D

Danke :)

LG SG ;-)
Me.PEBKAC ^^
BlackJack

@SG ;-): Listen sind ein Datentyp und es gibt eine Klasse dafür. Datentyp und Klasse sind in Python im Grunde synonym. In Python ist alles was man an einen Namen binden kann ein Objekt und jedes Objekt hat einen Typ, also auch in irgendeiner Form ein Klassenobjekt in dem das Verhalten dieser Objekte kodiert ist.

Listen selbst kann man keine neuen Attribute hinzufügen. Man kann eigene Klassen davon ableiten, allerdings würde ich das nur machen wenn man tatsächlich alles was eine Liste bietet auch braucht, und man damit leben kann das man entweder trotzdem noch alle Methoden überschreiben muss die eine Liste zurückgeben, damit sie stattdessen Objekte vom neuen Typ liefern, oder das eben normale Listen von diesen Methoden zurückgegeben werden. Üblicher ist es Containertypen durch Komposition zu definieren, also eine eigene Klasse welche die ”magischen” Methoden für Indexzugriffe, `len()`, Iteration über den Inhalt, usw. implementiert und die enthaltenen Elemente dann intern zum Beispiel in einer Liste ablegt.

Das mit dem „die alte (Liste) überschreiben” klingt ein bisschen irreführend, denn wenn man eine neue Liste erstellt und die an den selben Namen bindet an den vorher die alte Liste gebunden war, hat das erst einmal keinen Einfluss auf die alte Liste. Die existiert unverändert weiter. Wenn sie nach der Operation nicht mehr vom Programm aus erreichbar ist, zum Beispiel weil sie irgendwo noch an einen anderen Namen gebunden ist oder in einer Datenstruktur verwendet wird, dann kann die Speicherbereinigung sich darum kümmern. Sonst natürlich nicht. Namen stehen nicht für Boxen in die man etwas hinein tut, sondern Namen sind Post-It-Zettelchen die man auf Objekte klebt. Ein Zettel klebt immer auf genau einem Objekt, aber auf einem Objekt können mehrere Zettel kleben.
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

@BlackJack

Langsam erhellt sich das ganze ein wenig.

Danke

LG SG ;-)
Me.PEBKAC ^^
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

SG ;-) hat geschrieben:@Hyperion

Doch, natürlich gibt es da Collections und Arrays, allerdings scheinen die in VBA etwas anderen Gesetzmäßigkeiten zu unterliegen als in Python, wenn ich das bis jetzt richtig verstanden habe. Und generell arbeite ich lieber mit Collections, da sich da eher die Möglichkeit bietet das ganze vernünftig zu kapseln, und man den Collections eben auch Methoden und Objekte hinzufügen kann.
Da kenne ich mich in VBA nicht aus und mir erschließt sich hier der Sinn nicht. Container oder Collections oder wie auch immer man die grundlegenden Formen nennen mag, sind eben je nach Sprache Objekte oder nicht. In nicht OO Sprachen wie C gibt es ja auch solche Container (z.B. in der Glib). Entscheidend ist doch eher die Zugriffssemantik. Man hat da idR. Container mit Index-Zugriff, welche mit Schlüssel-Wert-Abbildungen und welche mit Mengen-Semantik analog zur Mathematik. Diese findest Du so oder so ähnlich in vielen Sprachen, seien es nun C++, Java, C#, Clojure, Ruby, usw. Und *immer*, wenn man mit vielen gleichartigen Daten arbeiten muss, braucht man irgend eine Form dieser Sammlungen. Das ist in Python nicht anders - und genau deswegen gibt es ja die wesentlichen gleich eingebaut :-) (Imho auch eine Lehre aus Sprachen wie C oder C++, bei denen es so etwas zu Beginn - bei C auch aktuell immer noch afaik - nicht gibt oder gab)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:(Imho auch eine Lehre aus Sprachen wie C oder C++, bei denen es so etwas zu Beginn - bei C auch aktuell immer noch afaik - nicht gibt oder gab)
Natürlich hat C auch Collections, nennen sich Arrays ;-)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
SG ;-)
User
Beiträge: 38
Registriert: Dienstag 26. August 2014, 17:50

@Hyperion

Also, was mir hier z.B. gänzlich neu ist, ist der Zugriff über Mengensemantik. Etwas in der Art gibt es in VBA allenfalls in den einzelnen Dialekten bei Befehlen, die sich z.B. direkt auf die Steuerung eines Worksheets in Excel o.ä. oder einer Datenbank in Access beziehen. Benötigt man so eine Funktionalität für ein Array oder eine Auflistungsklasse, dann muss man sich eben dazu eine entsprechende Prozedur selbst schreiben. Das gleiche gilt für Methoden wie z.b. "Sort". Es gibt zwar z.B. in Excel-VBA einen Befehl, mit dem man einen gewählten Bereich im Worksheet nach bestimmten Kriterien sortieren kann, aber für Arrays oder Auflistungsklassen gibt es das nicht. Das muss man sich selbst schreiben. Wobei die Arrays in VBA einfach nur simple Feldvariablen mit einer nahezu beliebigen Anzahl von Dimensionen sind. Bei komplexeren Operationen läuft man hier sehr schnell in eine Ablaufproblematik, die sich selbst reproduzierende Bugs generiert^^. Und um eine stabile Sort-Methode für eine Collection zu schreiben braucht man sicher ~50-100 Zeilen Code.

Von daher ist das hier schon nicht schlecht, aber für einen VBAler eben gewöhnungsbedürftig. :D

LG SG ;-)
Me.PEBKAC ^^
Antworten