Zugriff auf Objektmethoden einer nicht typisierten Liste

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
JumPoi
User
Beiträge: 3
Registriert: Dienstag 26. Februar 2019, 13:53

Ich grüße euch,

ich bin neu in Python und kome eigentlich aus der .NET Ecke. Ich arbeite mit Python Version 3.7 und mit der neusten verfügbaren PyCharm Community Edition.

Ich habe eine Node Klasse für einen Tree geschrieben, und bin dabei auf folgendes Problem gestoßen, welches ich mit folgendem Snippet verdeutlichen möchte:

Code: Alles auswählen

class Node:
	children = []
	def __init__(self, create_children):		
			if create_children == true:
				children.append(Node(false))
				children.append(Node(false))
				children.append(Node(false))
			for child in children:
				child.<keine Vorschläge mehr von pycharm>
	def do_something:
		...
	def do_seomething_else		
Mein Problem an dieser Stelle ist folgenes. Pycharm scheint beim Iterieren über Listen keine Methoden und Eigenschaften der Elemente der Liste mehr zu kennen. Da die Liste nicht typisiert ist, wie z.B. in C# oder Java, macht das für mich auch Sinn.
Meine Frage: Kann ich die Liste irgendwie so typisieren/markieren/..., dass ich auch beim Zugriff auf die Elemente durch Pycharm Zugriff auf Eigenschaften und Methoden habe?

Viele Grüße
JumPoi
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

@JumPoi: Klassenvariablen zu benutzen ist eine ganz schlechte Idee, denn die Liste children ist die selbe für alle Node-Instanzen.
`true` und `false` sind nicht definiert, Du meinst wohl True und False, dann aber nicht explizit auf `True` prüfen. `children` in __init__ ist nicht definiert, da sollte PyCharm eigentlich schon meckern. Eingerückt wird in Python immer mit 4 Leerzeichen pro Ebene, keine Tabs. Gerade für die Fehlersuche wäre nicht ganz so falscher Code praktisch.

Und eine kurze Suche ergibt folgenden Treffer: https://www.jetbrains.com/help/pycharm/ ... oduct.html
JumPoi
User
Beiträge: 3
Registriert: Dienstag 26. Februar 2019, 13:53

Danke für die Antwort. Ich habe diesem Code hier zum verdeutlichen direkt im Forum runtergehackt und nicht aus dem Projekt kopiert. Im Runterhacken in Python bin ich noch nicht stark und vergess so Sprachconstraints wie das Schreiben der Klassennamen vor Klassenvariablen innerhalb der gleichen Klasse. Die children sind im realen Beispiel Objektvariablen und True natürlich auch groß geschrieben. Ich dachte zum verdeutlichen meiner Frage sei das Beispiel ausreichend. Nach über einer Stunde suchen, habe ich beschlossen mir ein Forum zu suchen und zu fragen.
Meine Google-Versuche gingen in die Richtung: ["execute list elements object methods", "generic list python", "typed list in python", "call methods on list elements"]. Das brachte mich nur alles nicht so richtig weiter :oops: :oops:
Ich schließe aus deiner Antwort, dass ich das Problem nur mit PyCharm, aber nicht mit Python selbst lösen kann. Danke dafür, das bringt mich weiter.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JumPoi: Nein, Du kannst das Problem in Python lösen unabhängig von PyCharm und zwar so wie das auf der Seite gezeigt wird. Wobei es nicht wenige Python-Programmierer gibt die Typannonationen kacke finden, denn es gibt ja einen Grund warum man Python verwendet und für viele spielt da mit rein, das man diese doofe statische Typisierung nicht mehr haben/schreiben wollte. Und jetzt kommt Typannonation ins Spiel wo man sich dann doch wieder damit herum schlagen muss, wenn man es denn verwendet, was aber im Gegensatz zu tatsächlich statisch typisierten Sprachen erst einmal überhaupt nichts am Programm ändert. Man kann das falsch machen ohne das das von Python aus irgendwie ein Problem wäre, weil Python selbst überhaupt nichts mit den Annotationen macht, ausser sie zu speichern.

Also für mich ist das ein Problem in Deinem Kopf/mit der Erwartungshaltung das die IDE einem immer und überall alle Methoden anzeigen kann die ein Objekt hat. Geht halt bei dynamisch typisierten Sprachen nicht, und wenn man das haben will/braucht, dann sollte man halt eine andere Programmiersprache verwenden.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
JumPoi
User
Beiträge: 3
Registriert: Dienstag 26. Februar 2019, 13:53

Du scheinst wohl kein Fan statischer Typisierung zu sein.
Und ja, es kann schon sein: Nach Jahren in einer Umgebung mit einer IDE, die einen verwöhnt, ist es eine gewisse Umgewöhnung keine Vorschläge mehr zu bekommen. Bisher hies das nämlich, man hat einen dämlichen Fehler irgendwo gemacht. Einem geouteten Anfänger allerdings zu sagen, er solle sich gefälligst anpassen oder sich eine andere Programmiersprache suchen ist kein besonders netter Empfang.
Ich bedanke mich trotzdem, da ich mir nun sicher bin, dass ich keinen Fehler gemacht habe, sondern es mit meiner Vermutung der nicht typisierten Listen zusammen hängt. Ich verstand den Link übrigens so, dass Type Hints ein Feature von Pycharm, und nicht von Python seien.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das kommt immer darauf an. Ich programmiere auch gerne in C und mehr oder weniger gerne in Java (lieber Kotlin), aber für Java *braucht* man eine IDE, das würde ich nicht in einem Texteditor schreiben wollen. Und auch für Python mit Typannotationen braucht man letztendlich eine IDE. Ich programmiere Python aber schon von Anfang an ”nur” in einem Texteditor und bin halt auch davon begeistert das man keine grosse IDE braucht.

Sorry das Du die schlechte Laune abbekommen hast, das es jetzt Typannotationen in Python gibt und das die wegen der doofen von statischen Programmiersprachen kommenden IDE-Benutzer und Studenden die bei Typsystemen ins schwärmen kommen jetzt in die Sprache Einzug halten. :twisted:

Die Typannonationen sind Python 3-Syntax. Python selbst macht nichts damit, aber es gibt Programme die damit eine statische Typprüfung machen. Zum Beispiel PyCharm. Und damit die auch auf Python 2 anwendbar sind, wurden von den Python-Entwicklern die Typannotationen als Kommentar spezifiziert.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten