string vergleichen für if/else

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
kornyclown

Hallo liebes Python Forum,
ich bin grade dabei mein erstes "wirkliches" Tool zu schreiben (kein Hello World oder Währungsrechner).

Es geht in meinem Beispiel um die Software Maya (3D Applikation wer's nicht kennt) und ich möchte ein Tool mit Python schreiben, welches in diese Software implementiert ist.

Ich muss verschiedene Nodes auf ihre Classification überprüfen, das tue ich mit

Code: Alles auswählen

import maya.cmds as mc

classi = mc.getClassification("irgendEineNode")

So damit habe ich das ganze in der Variablen classi gespeichert.
Wie wir hier sehen:
http://download.autodesk.com/us/maya/20 ... ation.html

kriege ich von dieser Funktion einen/mehrere Strings der Classification zurück oder ein leeres Array wenn keine Classification vorliegt.

Beispiel:

Code: Alles auswählen

classi = mc.getClassification('lambert')
for c in classi[:]:
    print "output: " + c

output: shader/surface
Wenn ich jetzt aber diesen Wert in classi nutzen will für eine if/else Anweisung was muss ich denn genau machen weil

Code: Alles auswählen

if classi == "shader/surface":
blablabla
funktioniert nicht
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Die Rückgabe ist anscheinend etwas iterierbares, da du ja versuchst alle seine Elemente auszugeben. D.h. der Ausgabe nach wird es wohl kein String sein und der Vergleich deswegen scheitern. Du bist wahrscheinlich daran interessiert zu schauen ob die Rückgabe den einen String als Element beinhält, nicht ob sie einer ist. Sollte es Fehlermeldungen geben, gewöhn es dir an diese auch zu posten, denn das hilft uns mehr als ein "funktioniert nicht".
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Mal ne kurze Frage :D

Code: Alles auswählen

for c in classi[:]:
Der Doppelpunkt in den eckigen Klammer macht eigentlich nichts sinnvolles und könnte auch weggelassen werden oder nicht?
kornyclown

Ja, ich möchte überprüfen ob der String den ich von der Funktion zurück bekomme und zum Beispiel der String "shader/surface" die gleichen Strings sind.
So wie ich das verstehe würde also

Code: Alles auswählen

if classi == "shader/surface":
nur den Datentyp prüfen und das gibt false weil classi ne Liste ist und "shader/surface" ein String, richtig?

Aber wie prüfe ich denn dann auf Gleichheit des Strings?

Hier nochmal mein falsches Beispiel (es gibt keine Fehlermeldung, es passiert einfach nichts):

Code: Alles auswählen

import maya.cmds as mc

classi = mc.getClassification('lambert')
if classi == "shader/surface":
    print "bla"
kornyclown

JonasR hat geschrieben:Mal ne kurze Frage :D

Code: Alles auswählen

for c in classi[:]:
Der Doppelpunkt in den eckigen Klammer macht eigentlich nichts sinnvolles und könnte auch weggelassen werden oder nicht?

Hm, ich habs so aus den Examples der Dokumentation kopiert

Code: Alles auswählen

classifications = cmds.getClassification('lambert')
for c in classifications[:]:
    print '\tClassified as ' + c + '\n'
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

@korny Deine Vermutung ist falsch, es wird nicht der Datentyp überprüft.
Stell dir einfach mal den Inhalt von classi vor, der dürfte ungefähr so aussehen:

Code: Alles auswählen

["shader/surface"]
Wenn du das nun mit dem string auf Gleichheit prüfst also

Code: Alles auswählen

"shader/surface" == ["shader/surface"]
Wirst du schon beim einfachen hinsehen merken das diese beiden Objekte nicht gleich sind.

Du solltest dich vielleicht nochmal mit listen beschäftigen.

Edit:

Jo ich habe mir die Doku angesehen, ändert aber nichts da dran das es meiner Meinung nach unnötig ist :P
kornyclown

Ah, ok
würde ich dann hiermit mehr Erfolg haben:

Code: Alles auswählen

if classi[0] == "shader/surface":
    print "bla"
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Denke schon, müsstest du einfach mal testen :P Kannst dir ja auch mal die ganze liste ausgeben lassen ;)
Übrigens solltest du noch prüfen ob classi überhaupt Elemente enthält, denn wenn die liste leer ist und du mit [0] auf das erste Element zugreift bekommst eine Exception.

Edit:

Besser ist es natürlich wenn du

Code: Alles auswählen

if "shader/surface" in classi:
    print "bla"
machst aber wie gesagt lese dich am besten mal in listen ein ;)
Antworten