Seite 1 von 1

Umlaute in def

Verfasst: Sonntag 11. März 2012, 19:47
von Kimmax
Hey leutchen
ich bin relativ neu in Python und hab mal ein Problem...
ich bin dabei ein Plugin für einen Siriserver(server, nicht Proxy) zu programmieren, welches auch ganz gut läuft nur halt nicht so wie ich es will...
Hier erstmal ein Ausschnitt:

Code: Alles auswählen

    @register("de-DE", "musik.*leiser")
    def musikleiser(self, speech, language):
        if language == 'de-DE':
            value = self.ask(u"Auf was soll die Lautstärke geändert werden?")
            os.system("amixer set Master \"{0}\" ".format(value))
            self.say(u"Ok, ich habe die Lautstärke für dich auf \"{0}\" gesetzt.".format(value))
funktioniert super, nur das ich gern den Befehl auf "Lautstärke ändern" ändern möchte, ich weiß auch wie, aber der Block muss die Wörter, die beim regestrieren verwendet werden enthalten..sprich:

Code: Alles auswählen

    @register("de-DE", "lautstärke.*ändern")
    def lautstärkeändern(self, speech, language):
        if language == 'de-DE':
            value = self.ask(u"Auf was soll die Lautstärke geändert werden?")
            os.system("amixer set Master \"{0}\" ".format(value))
            self.say(u"Ok, ich habe die Lautstärke für dich auf \"{0}\" gesetzt.".format(value))
ansonsten erkennt Siri den Befehl nicht.
Wenn ich den Code so verwenden möchte, meckert Python wegen dem Umlaut hinter dem def, also wie kann ich das trotzdem realiesieren?
Danköö,
Kim

Re: Umlaute in def

Verfasst: Sonntag 11. März 2012, 19:50
von BlackJack
@Kimmax: Das geht nicht. Buchstaben ausserhalb von ASCII sind in Namen erst in Python 3 erlaubt.

Re: Umlaute in def

Verfasst: Sonntag 11. März 2012, 19:51
von Kimmax
verdammt :( gibt es vieleicht einen andren weg, um dieses Problem evt. zu lösen?

Re: Umlaute in def

Verfasst: Sonntag 11. März 2012, 20:43
von EyDu
Hallo.

Du könntest das hier versuchen:

Code: Alles auswählen

def myregister(name, *args, **kwds):
    def wrapper(func):
        func.__name__ = name
        return register(*args, **kwds)(func)

    return wrapper


@myregister("lautstärkeändern", "de-DE", "lautstärke.*ändern")
def lautstaerkeaendern(speech, language):
    if language == 'de-DE':
            value = self.ask(u"Auf was soll die Lautstärke geändert werden?")
            os.system("amixer set Master \"{0}\" ".format(value))
            self.say(u"Ok, ich habe die Lautstärke für dich auf \"{0}\" gesetzt.".format(value))
Mit welchem Modul arbeitest du eigentlich? Am einfachsten wäre es dann sich den Code von ``register`` anzuschauen.

Sebastian

Re: Umlaute in def

Verfasst: Sonntag 11. März 2012, 22:28
von pillmuncher
Oder ganz einfach:

Code: Alles auswählen

class Test(object):
    pass

def methode(self, n):
    print n


setattr(Test, 'äöü', methode)

o = Test()

getattr(o, 'äöü')(5)
Ergebnis:

Re: Umlaute in def

Verfasst: Sonntag 11. März 2012, 22:53
von lunar
Diese “Workarounds“ funktionieren allerdings nur, wenn das Modul, welches den Funktionsnamen beziehungsweise das Attribut setzt, und das Modul, das diese dann abfragt, dieselbe Kodierung verwenden. Ist das eine Modul in ISO-8859-1 kodiert, das andere aber in UTF-8, sieht das abfragende Modul Datenmüll, da Funktions- und Attributnamen in Python 2 Bytestrings sind.

Insofern wäre vielleicht erstmal ein Blick in die API-Dokumentation des Programms angesagt, um herauszufinden, ob es nicht eine andere Möglichkeit gibt. Ohne zu wissen, um welches Programm es sich handelt, lässt sich dazu nicht viel mehr sagen.

Re: Umlaute in def

Verfasst: Montag 12. März 2012, 01:49
von Leonidas
Und mal abgesehen davon kann man in Python sowohl Single-Quotes als auch Double-Quotes als Delimiter verwenden, somit muss man keine Double-Quotes escapen, sondern setzt den String in Single-Quotes und kann dann Double-Quotes ganz normal verwenden. Oder aber man verwendet tatsächlich "Gänsefüßchen", wie sie in typografisch korrektem Deutsch genutzt werden. Und ne andere Sache ist dass man auch kein ``os.system`` verwenden sollte sondern das ``subprocess``-Modul. Da brauchst du dann kein String-Formatting mehr, weil man subprocess von Haus aus eine Liste von Argumenten mitgibt.