QString (PyQt4) wird zu str (PySide2) was wird aus QString.append()

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
JoS
User
Beiträge: 5
Registriert: Dienstag 26. Januar 2010, 23:07

Hallo!

Ich habe vor bald 10 Jahren ein Programm geschrieben bei dem ich PyQt4 und Python 2 verwendet habe. Aus div. Gründen ist es jetzt an der Zeit auf Python 3 und PySide2 zukonvertieren. Weil es praktisch war, habe ich damals vor Allem dann Texte als QString deklariert, wenn ich auf Methoden zugreifen wollte, die in den Python Textobjekten nicht verfügbar waren. Also: QString.append(), QString.chop() oder QString.insert().
Wenn jetzt QString nicht mehr verfügbar ist und darauf verwiesen wird, dass str() verwendet werden soll (muss), dann fehlen mir u.a. die oben genannten Methoden. Leider haben ich keine weiteren Informationen gefunden, auf welche Weise diese Methoden in str() realisiert sind.
Meine Versuche mit einer neuen Klasse, die von str erbt schlagen fehl. Zum Beispiel für .append():

Code: Alles auswählen

class StringClass(str):
    def __init__(self,string=""):
        self.internal_string=str(string)
    def append(self,string):
        self.internal_string=self.internal_string + string
        
meinString=StringClass("Aussage")
meinString.append(": JA!")

print(meinString)

Output:
Aussage        
self.internal_string ist natürlich "Aussage: JA!" nach dieser Operation.

Meine Fragen:
Gibt es einen offiziellen Weg für die Konvertierung von QString nach str, der auch die von mir genannten Methoden berücksichtigt?
Was wäre der beste Weg?
Ich hoffe mein Weg ist nicht grundsätzlich zum Scheitern verurteilt, aber wie bekomme ich es hin, dass meinString den Inhalt von self.internal_string bekommt?

Vielen Dank!
JoS
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Strings sind unveränderlich. An den Stellen, wo Du append benutzt, mußt Du halt zwei Strings zu einem neuen verbinden.
Benutzeravatar
__blackjack__
User
Beiträge: 13087
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JoS: Ich würde nicht nach einer schnellen Lösung suchen wie man `QString` nachbauen kann um möglichst nichts weiter am Programm ändern zu müssen, sondern das ganze so umschreiben, dass auch tatsächlich Python-Zeichenketten idiomatisch verwendet werden. Da die unveränderlich sind, kann das auch bedeuten das man auch tatsächlich konzeptionell darüber nachdenken sollte und nicht einfach nur per suchen/ersetzen `QString`-Methodenaufrufe durch Ausdrücke mit Python-Zeichenketten ersetzen sollte.

Weil ``string.append(suffix)`` dann ja beispielsweise zu ``string += suffix`` wird, was aber zum Beispiel in Schleifen in Python keine gute Idee ist, da ineffizient. Idiomatisches Python wäre an der Stelle das sammeln der Teilzeichenketten in einer Liste die am Ende dann mit der `join()`-Methode zusammengesetzt wird.

In einigen Fällen wird man vielleicht auch eher die Einzelwerte per Zeichenkettenformatierung einsetzen – ab Python 3.6 auch mit den praktischen f-Zeichenkettenliteralen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
JoS
User
Beiträge: 5
Registriert: Dienstag 26. Januar 2010, 23:07

Vielen Dank für die Antworten! Und die Geschwindigkeit mit der geantwortet wurde. Wirklich sehr gut!
Ich werde dann wohl dem guten Hinweis mit der Liste folgen.

Eine kleine Anmerkung in Richtung der Verfasser von verschiedenen Dokumentationen/Tutorials und vor allem in Richtung jener die die Pythonbindings von Qt bereitstellen, sei mir aber noch erlaubt: Ich hätte mir viel Zeit erspart, wenn irgendwo in den Dokumentationen (die im Übrigen meist sehr hilfreich sind) neben dem Hinweis, dass QString jetzt durch str ersetzt wird (und eigentlich alles so weiter läuft wie gehabt) auch stehen würde, dass folgende Methoden (.append, .chop, .insert etc.) aus Gründen von str nicht zur Verfügung gestellt werden können.
Benutzeravatar
__blackjack__
User
Beiträge: 13087
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JoS: Die Leute die die Dokumentation der Qt-Python-Bindings verfassen gehen wahrscheinlich, und IMHO berechtigterweise, davon aus, dass man Python kann bevor man ein GUI-Programm damit schreibt, denn man braucht da ja schon ziemlich viel von Python, inklusive objektorientierter Programmierung, so dass es sehr unwahrscheinlich ist, das man so grundlegende Datentypen wie `str` nicht beherrscht. Zahlen, Zeichenketten, Listen, Wörterbücher sind ja die absoluten Grundlagen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten