Autovervollständigen ist unbefriedigend

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
velosolex
User
Beiträge: 2
Registriert: Freitag 3. März 2017, 10:14

Freitag 3. März 2017, 10:35

Hallo Forum

Ich wundere mich schon seit längerer Zeit, dass das Autovervollständihen oder besser das Vorschlagen von Befehlen nicht sauber funktioniert.
Es fehlen manchmal wesentliche Befehle.

Im folgenden Beispiel würde ich erwarten, das als Vorschlag "cursor" kommt, wenn ich "zeiger = verbindung.c" eingegeben habe. Dem ist aber nicht so.

Weiß jemand, ob man das verbessern kann. Kann man da was einstellen. Ich kenne so ein Verhalten eigentlich nicht. Ich bide mir auch ein, dass manchmal mehr und manchmal weniger Vorschläge angezeigt werden. Problem scheint es auch zu geben, wenn Variablenname genauso wie Klassennamen heißen.

Vielleicht kann mir jemand helfen. Ich finde dieses Feature doch extrem wichtig, und möchte nicht darauf verzichten.

Ich arbeite mit Version 2.7.13



*****
mport sqlite3
verbindung = sqlite3.connect("test.db")
zeiger = verbindung.cursor
*****
BlackJack

Freitag 3. März 2017, 11:22

@velosolex: Autovervollständigung *wo*? Von welchem Editor oder welcher IDE reden wir denn hier? Gegebenenfalls auch noch welches Plugin das für Python-Unterstützung sorgt?

Grundsätzlich ist Autovervollständigung bei dynamisch typisierten Programmiersprachen ein Problem. Um `cursor` vorschlagen zu können, muss der Editor oder die IDE ja wissen was `connect()` zurück gibt und das dieses Objekt ein `cursor`-Attribut hat. Statische Analyse von dynamischen Programmiersprachen hat ihre Grenzen. Nochmal etwas stärker wenn der Code nicht in Python geschrieben ist, sondern in einem in C geschriebenen Erweiterungsmodul steckt. Da kann die Analyse ja nicht hinein schauen.

Probleme wenn Variablen wie Klassen heissen, sollte es nicht geben, ausser natürlich die, die man dann erwarten sollte und die man dann ja auch ganz normal im Code hat: der Name der Variablen verdeckt den der Klasse, was ja auch nur eine Variable ist. Man kann dann also die Klasse nicht mehr erreichen wenn man etwas anderes an ihren Namen bindet. Die Situation sollte aber eigentlich auch nicht vorkommen wenn man sich an die Namenskonventionen hält. Dann haben Klassen grundsätzlich andere Namen als andere Objekte.

Wenn Dir Autovervollständigung wie bei einer statisch typisierten Sprache extrem wichtig ist, dann musst Du eine statisch typisierte Sprache verwenden.
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Freitag 3. März 2017, 11:23

Wo benutzt du denn die Autovervollständigung?
In python? In Jupyter oder bpython? In einem Editor? In einer IDE?
velosolex
User
Beiträge: 2
Registriert: Freitag 3. März 2017, 10:14

Freitag 3. März 2017, 14:21

Ich arbeite mit Eclipse Neon und PyDev 5.5
__deets__
User
Beiträge: 3500
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 3. März 2017, 15:15

So weit ich weiss ist PyDev recht gut mit dem Verfollstaendigen, insofern wird es wohl nicht besser werden, als es ist. Falls dir das besonders wichtig, nimm zB Java. Dafuer schreibst du dann halt 5-10 mal so viel Code :twisted:

Mir persoenlich reicht das "symbol-complete" von Emacs, bei dem ich ein paar Zeichen tippe, und dann eine Liste mit Bekannten Namen durchlaufen kann. Das ist nicht besonders klug, spart aber schon ausreichend Tipparbeit.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Freitag 3. März 2017, 16:23

__deets__ hat geschrieben:So weit ich weiss ist PyDev recht gut mit dem Verfollstaendigen, insofern wird es wohl nicht besser werden, als es ist. Falls dir das besonders wichtig, nimm zB Java. Dafuer schreibst du dann halt 5-10 mal so viel Code :twisted:
Dafür hast du auch 5-10 mal so viel Code-Completion, also tippst du ca. die gleiche Menge :twisted:
the more they change the more they stay the same
__deets__
User
Beiträge: 3500
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 3. März 2017, 16:34

So weit die Theorie. Praktisch scheint in der Java-Welt noch Abstrakteritis zu grassieren. Als Begutachter fuer einen simplen Einstellungstest habe ich ueblicherweise Python-Loesungen in der Groessenordnung 100-200 Zeilen Code, oft sogar inklusive voller Testabdeckung gesehen.

Die Java-Loesung hatten dann ueblicherweise so 3000 Zeilen, eher selten Tests, und vor allem musst man auf der Suche nach der eigentlichen Implementierung immer nach "*Util.java" oder aehnlichem ausschau halten, weil die AbstractProviderFactorySessionBeanImpl nix als generierten Durchreichcode beinhaltete...
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Freitag 3. März 2017, 19:55

Gute Autovervollständigung zur Programmierzeit und dynamische Typisierung beissen sich. Zwar hilft Pythons strenge Typisierung hier etwas aus, trotzdem hat der Editor bzw. die IDE das Problem, bei komplexem Programmcode Laufzeitentscheidungen raten zu müssen. Besser als heuristische Ansätze gibts da nicht. Und da sind die IDEs unterschiedlich gut drin.
So ist es z.B. nicht verwunderlich, dass im Javascriptland die Situation noch schlimmer ist, weil die Sprache schwache (Proto-)Typisierung zulässt.
Antworten