Generator schmeißt keine Exception?!

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
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Moin

Code: Alles auswählen


    def move_handler(self, direction="DOWN"):
        """Generator: give member, new_position tuples and yield None, None tuples if an object is
        going to collide on the next move."""
        DIRECTIONS = { "LEFT" : -1, "RIGHT" : 1, "DOWN" : False }
        new_positions = {}
        superblock_leaving_field = False
        do_not_freeze = True

        for member in self.members[:]:
            position_to_check = member.get_position()

            try:
                if not DIRECTIONS[direction]:
                    new_position = (position_to_check[0] - 1, \
                    position_to_check[1]) # Block is moving vertical
                else:
                    new_position = (position_to_check[0], \
                    position_to_check[1] + DIRECTIONS[direction])
            except KeyError:
                raise PositionException("Given Direction to Move isnt \
                'LEFT' nor 'RIGHT' nor 'DOWN'. Cannot move.")

                *snip*

                yield member, new_position
(vereinfacht)

Das schmeißt bei mir keine exception im unittest, beim direkten aufrufen in idle bekomm ich nach nem next() bloß sofort StopIteration, aber nicht die eigentliche Exception...? Bei dem Testskript hier funktionierts allerdings:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

def foo_generator(foo="FALSE"):
    BAR = { "FOO" : 1, "BAR" : 2, "SPAM" : 3 }

    try:
        yield BAR[foo]
    except KeyError:
        raise ValueError("Blablabla")
    
    yield "dummy string"

foobar = foo_generator()
foobar.next()
Die Dokumentation schreib ich noch richtig, is nur im moment noch lausig.^^

OT: Gibts eigentlich ne vim steuerung fürn browser (FF) ? langsam nervt der standard modus beim sürfän ^_^

EDIT: Grad mal geschaut bei mozilla.com, gibts sogar: https://addons.mozilla.org/en-US/firefox/addon/4891
Mal schauen >_>
BlackJack

Direkte Antwort auf die Frage habe ich nicht, aber ändert sich `direction` innerhalb der Schleife? Falls nicht sollte man das einmal *vor* der Schleife abklären. Bei Argumenten am besten am Anfang der Funktion so etwas wie:

Code: Alles auswählen

        if direction not in DIRECTIONS:
            raise ValueError('%r not allowed as direction (%s)'
                             % (direction, ', '.join(DIRECTIONS)))
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Hm, also ich hab vorhin auch nen wenig in richtung if direction not in rumgespielt und das raise zeug auskommentiert, jetzt hab ich die comments wieder entfernt und nun gehts... :?:

Code: Alles auswählen

>>> superblock.spawn()
True
>>> superblock.move_handler("FALSE")
<generator object at 0x8928a6c>
>>> superblock.move_handler("FALSE").next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/media/Daten/Tetrix0r/Tetrix0r.py", line 121, in move_handler
    to Move isnt 'LEFT' nor 'RIGHT' nor 'DOWN'. Cannot move.")
Tetrix0r.PositionException: Given Direction                 to Move isnt 'LEFT' nor 'RIGHT' nor 'DOWN'. Cannot move.
Die Lücke resultiert vom "logischem zeilenumbruch" per \ am ende der zeile, was wiederrum eigenartig erscheint... :?

Hab Flux mal eine Überprüfung in meinen Unittest hinzugefügt...

EDIT:

Also im diff is auch nichts ersichtlich, außer daß ich das \ nen wenig weiter nach vorne gesetzt hab...

Code: Alles auswählen

--- a/Tetrix0r.py
+++ b/Tetrix0r.py
@@ -117,8 +117,8 @@ class SuperBlock:
                     new_position = (position_to_check[0], \
                     position_to_check[1] + DIRECTIONS[direction])
             except KeyError:
-                raise PositionException("Given Direction to Move isnt \
-                'LEFT' nor 'RIGHT' nor 'DOWN'. Cannot move.")
+                raise PositionException("Given Direction \
+                to Move isnt 'LEFT' nor 'RIGHT' nor 'DOWN'. Cannot move.")
BlackJack

Die Lücke ist ganz normal, schliesslich sind die Leerzeichen ja im Quelltext vorhanden.

Du verwendest den \ aber sowieso anscheinend viel zu oft und vor allem unnötigerweise. Logische Zeilen sind für den Compiler erst zu ende, wenn alle geöffneten Klammern wieder geschlossen sind. Also braucht man in einer Argumentliste für einen Funktionsaufruf schon mal keine \. Und bei Zeichenketten fügt der Compiler solche, die nur durch "whitespace" getrennt sind, bei der Übersetzung automatisch zu einer zusammen. Das könnte man also so schreiben:

Code: Alles auswählen

            except KeyError:
                raise PositionException("Given Direction to Move isn't "
                                        "'LEFT' nor 'RIGHT' nor 'DOWN'. "
                                        "Cannot move.")
Ich versuche \ komplett zu vermeiden und setze lieber Klammern um einen Ausdruck, wo das nötig ist. Aber das ist wohl auch ein wenig Geschmacksfrage.

Du solltest fortgesetzte Zeilen übrigens einrücken, damit man sieht, das es immer noch zu dem Ausdruck oder der Anweisung davor gehört.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Hm das Strings direkt aneinander gekettet werden wusste ich noch nicht bzw ich dachte, das wäre nur bei print so >_>

Die \ hab ich gesetzt, um explizit anzuzeigen, das es noch weitergeht - hab ich glaub irgendwann mal eingehämmert bekommen... Wenn ich's allerdings weiter einrücke, sieht das deutlich toller aus - Danke!
Antworten