Tupelfrage (Anfängerfrage) (gelöst)

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
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

Hallo zusammen!

Ich habe eine Methode in einer Klasse, die so aussieht:

Code: Alles auswählen

def point_in_rect (self, p = (0,0), r = ((0, 0), (10, 10))):
    px, py = p
    rx, ry, rw, rh = r
    ....
Hier kommt aber ein Fehler, daß ich so nicht an die Elemente der Tupel in r kommen könne. Nun probiere ich

Code: Alles auswählen

def point_in_rect (self, p = (0,0), r = ((0, 0), (10, 10))):
    px, py = p
    a, b = r
    rx, ry = a
    rw, rh = b
    ....
und es funktioniert. Gibt außer dieser Umschreibung noch einen Trick, wie ich an die Tupelelemente kommen kann, und zwar ohne diese Hilfsvariablen?

Da r ein ganz normales Rechteck ist, würde ich dem Anwender gerne ermöglichen, auch Rechtecke der Form (0, 0, 10, 10) einzugeben, also vier statt derer zwei Tupelelemente. Kann man die Methode so umschreiben, daß beide Sorten Rechtecke akzeptiert werden?

Liebe Grüße und einen guten Rutsch

Gnushi
Zuletzt geändert von Gnushi am Montag 1. Januar 2007, 20:43, insgesamt 1-mal geändert.
BlackJack

Gnushi hat geschrieben:Ich habe eine Methode in einer Klasse, die so aussieht:

Code: Alles auswählen

def point_in_rect (self, p = (0,0), r = ((0, 0), (10, 10))):
    px, py = p
    rx, ry, rw, rh = r
    ....
Wird da auch irgendwo `self` benötigt? Wenn nicht, dann gehört's sehr wahrscheinlich nicht in diese Klasse sondern ist einfach eine Funktion.
Hier kommt aber ein Fehler, daß ich so nicht an die Elemente der Tupel in r kommen könne. Nun probiere ich

Code: Alles auswählen

def point_in_rect (self, p = (0,0), r = ((0, 0), (10, 10))):
    px, py = p
    a, b = r
    rx, ry = a
    rw, rh = b
    ....
und es funktioniert. Gibt außer dieser Umschreibung noch einen Trick, wie ich an die Tupelelemente kommen kann, und zwar ohne diese Hilfsvariablen?
Ich würd's nicht Trick nennen: Das entpacken funktioniert auch "rekursiv". Du hast ein Tupel mit zwei Elementen, also müssen auf der linken Seite der Zuweisung auch zwei "Empfänger" stehen. Das können auch wieder Tupel sein auf die dann die jeweiligen Elemente verteilt werden:

Code: Alles auswählen

def point_in_rect(self, p=(0,0), r=((0, 0), (10, 10))):
    px, py = p
    (rx, ry), (rw, rh) = r
Du kannst die Argumentliste auch gleich so schreiben das alles auf einzelne Namen verteilt wird:

Code: Alles auswählen

def point_in_rect((point_x, point_y),
                  ((upper_left_x, upper_left_y), (width, height))):
    # ...
Hier habe ich jetzt Deine Vorgabewerte weggelassen, aber die machen IMHO bei so einer Funktion nicht wirklich Sinn.
Da r ein ganz normales Rechteck ist, würde ich dem Anwender gerne ermöglichen, auch Rechtecke der Form (0, 0, 10, 10) einzugeben, also vier statt derer zwei Tupelelemente. Kann man die Methode so umschreiben, daß beide Sorten Rechtecke akzeptiert werden?
Ja das geht, wird aber schnell unsauber. Entscheide Dich lieber für eine Variante.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Code: Alles auswählen

r = ((0, 0), (10, 10))
# entweder `entpacken`:
a, b = r
print a, b # (0, 0) (10, 10)
# oder wie bei Listen drauf zugreifen:
a = r[0]
b = r[1]
print a, b # (0, 0) (10, 10)
# wobei das auch gleich so ginge:
rx = r[0][0]
ry = r[0][1]
rw = r[1][0]
rh = r[1][1]
print rx, ry, rw, rh # 0 0 10 10
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

BlackJack hat geschrieben: Du kannst die Argumentliste auch gleich so schreiben das alles auf einzelne Namen verteilt wird:

Code: Alles auswählen

def point_in_rect((point_x, point_y),
                  ((upper_left_x, upper_left_y), (width, height))):
    # ...
Genau so mache ich das nun. Vielen Dank für die Hilfe.

Gnushi
Antworten