Seite 1 von 3
eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 16:25
von Pitwheazle
Wieder mal was Originelles. Mengen setzt man in geschweifte Klammern. Python erwartet aber immer ein Paar davon. In meinem Rechentrainer müssen die Kids Mengen angeben, ich möchte ihnen aber die geschweiften Klammern schon vorgeben. Also im Text vor dem Eingabefeld ""Ω={" ... dann kommt das Eingabefeld und danach steht ... "}".
Hat jemand eine Idee?
(Ich weiß, dass man ein Paar geschweifter Klammern mit {{}} ausgeben kann, eine einzelne scheint aber nicht zu gehen.)
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 16:53
von sparrow
Spezifizier mal das Problem. Ich denke, du meinst das Django Template-System. Und gerade da sollte eine einzelne Klammer eigentlich kein Problem sein.
Was gibt es für eine Fehlermeldung?
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 17:04
von Pitwheazle
Nein, nicht Django (daher habe ich den Post auch hier eingestellt). Es handelt sich um das f-String-Format, also mit ".format()".Hier "frage = "Ω={}".format("{")" zu benutzen geht auch nicht.
Die Fehlermeldung:
Einen Vorschlag aus stock overflow habe ich auch schon ausprobiert:
you can replace '{' and '}' to their corresponding codepoint \u007b and \u007d.For example print(' \u007b \u007d') got { }
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 17:12
von Dennis89
Hallo,
kannst du mehr Code zeigen, der den Fehler wirft?
Weil:
Deine Fehlermeldung bringt mich auf dieses Thema, vielleicht hilft dir das weiter:
https://stackoverflow.com/questions/907 ... g-format-a
Grüße
Dennis
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 17:27
von Pitwheazle
Das ist nicht so einfach, den Code aus der Django-Umgebung zu isolieren. Aber es stimmt in meiner Python-Sandbox funktioniert der Code. Also scheint es doch ein Django-Problem zu sein.
Mein Rechentrainer ist ja ein ziemlich großes Programm und ich weiss (mal wieder) nicht, wo ich da anfange.
Code: Alles auswählen
def wahrscheinlichkeit():
...
text = "Die Menge aller möglichen Ergebnisse heißt Ergebnisraum.<br>Man bezeichnet ihn mit 'Ω' und setzt die einzlnen Ergebnisse in geschweifte Klammern.<br>"
frage = "Ω={"
einheit = "}"
...
return text, frage, einheit
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 17:31
von __blackjack__
@Pitwheazle: Das verträgt sich jetzt aber nicht mit der Aussage „Also im Text vor dem Eingabefeld ""Ω={" ... dann kommt das Eingabefeld und danach steht ... "}".“, denn Du bastelst da mit einer f-Zeichenkette kein HTML von Hand. Wie soll da also ein Eingabefeld zwischen die Klammern kommen?
So etwas steht ansonsten auch in der Python-Dokumentation: Man verdoppelt die Klammern:
Code: Alles auswählen
In [412]: a=42
In [413]: f"Ω={{{a}}}"
Out[413]: 'Ω={42}'
Das was in Deinem Code `frage` heisst ist keine Frage und das da `einheit` heisst ist keine Einheit. Das ist schlecht.
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 17:44
von Pitwheazle
Hier ist ein Ausschnitt aus meinem Template:
Code: Alles auswählen
<fieldset>
{{frage}}
{{form.eingabe}}
{{einheit}}
<input type="submit" value="Prüfen">
</fieldset>
und das sieht z.B. so aus:

und da stimmen die Bezeichnungen schon. Ich habe sehr viele verschiedene Aufgabenkategorien, die alle über das gleiche Template aufgerufen werden und irgendwie muss ich ja die Felder vor und hinter dem Eingabefeld nennen.
Und das mit den verdoppelten Klammern habe ich (wie geschrieben) schon ausprobiert - das funktioniert bei einem Paar aber nicht bei einer einzelnen Klammer.
Noch ein Nachtrag:
bei "frage" und "einheit" benutze ich die f-String Formatierung nicht. Nur im Aufgabentext (Hier "Wie viele Sekunden entsprechen einer Minute?"). Aber ich gehe davon aus, dass VBCode überprüft, ob mein Code richtig ist und hier einen Fehler findet.
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 17:59
von sparrow
Das ist mir zu wirr.
Kannst du bitte nur den Code zeigen, der das Template aufruft, und das Template?
De erzählst hier etwas von f-Strings, in deinem Code tauchen sie aber nicht auf. Aber nun sind wir doch wieder bei der Template-Engine, von der du aber meinst, dass du sie nicht verwendest.
Also: View und Template.
Das Ergebnis und was du erwartest.
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Donnerstag 9. Mai 2024, 18:21
von Sirius3
Und wie so oft, fehlt bei Deiner Frage wieder der nötige Kontext, um das Problem nachvollziehen zu könne. Wo tritt welcher Fehler konkret auf? Bisher führt nichts, was Du beschrieben hast, zu einem Fehler.
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 12:25
von Pitwheazle
Das aufgerufene view hat zwischenzeitlich 6700 Zeilen und das aufgerufene Template auch 175. Ich habe mal verucht die entsprechenden Teile zusammenzustellen ... und dabei auch den Fehler entdeckt - ich habe doch auch die f-string Funktion bei "frage" benutzt:
Code: Alles auswählen
from django.shortcuts import render
def wahrscheinlichkeit():
#...
titel = "Wahrscheinlichkeitsrechnung"
text = "Die Menge aller möglichen Ergebnisse heißt Ergebnisraum.<br>Man bezeichnet ihn mit 'Ω' und setzt die einzlnen Ergebnisse in geschweifte Klammern.<br>"
variable = ["irgendeine Aufgabe"]
frage = "Ω={"
einheit = "}"
#...
return titel, text, frage, einheit, variable
def main():
#...
titel, text, frage, variable, einheit = wahrscheinlichkeit()
text = text.format(*variable)
[b]frage=frage.format(*variable)[/b]
#...
context = dict( titel = titel, text = text, frage = frage, einheit = einheit)
return render('core/aufgabe.html', context)
(Wenn ich die Fehlermeldung sorgfältiger gelesen hätte, hätte ich den Hinweis dazu auch finden können - Entschuldigung, da habe ich euch wieder Zeit gestohlen!)
Dazu eine neue Frage:
In VBCode habe ich jetzt rausbekommen, dass ich PythonCode in eine Datei packen und dort aufrufen kann. Geht das auch mit so einem "Test"-Code, wie da oben, mit dem ich auf forms und Templates zugreifen kann?
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 13:17
von sparrow
VBCode sind Tags, mit der man Formatierung in Internetforen verwenden kann.
Ich sehe da übrigens noch immer keinen f-String
Das ist ein f-String:
6700 Zeilen für einen View sind 6680 zu viel.
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 13:26
von Pitwheazle
sparrow hat geschrieben: Freitag 10. Mai 2024, 13:17
6700 Zeilen für einen View sind 6680 zu viel.
und wo packe ich diese 6680 hin?
sparrow hat geschrieben: Freitag 10. Mai 2024, 13:17
VBCode sind Tags, mit der man Formatierung in Internetforen verwenden kann.
Sorry: Visual Studio Code
sparrow hat geschrieben: Freitag 10. Mai 2024, 13:17
Ich sehe da übrigens noch immer keinen f-String
da erwartet der Code wohl einen - und den nutze ich auch an einigen Stellen:
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 14:10
von sparrow
Der Code erwartet das? Du schreibst doch View und Template?!
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 17:20
von noisefloor
Hallo,
Code: Alles auswählen
...
variable = ["irgendeine Aufgabe"]
frage = "Ω={
...
frage=frage.format(*variable)
kann doch nicht funktionieren - wirft das keinen Fehler? `frage` hat keine Platzhalter für die Stringformatierung.
Und die Variablennamen sind echter Müll, sorry. `variable` kann alles sein, ist also total nichtssagend. Und wenn würde ich da auch keine Liste erwarten. `frage` ist keine Frage, sondern ein String mit ein paar Zeichen drin. `einheit` ist keine Einheit - jedenfalls ist mir keine Einheit bekannt, die eine schließende geschweifte Klammer als Zeichen hat.
Das aufgerufene view hat zwischenzeitlich 6700 Zeilen
Hat wirklich _ein_ View 6700 Zeile oder hat deine views.py 6700 Zeilen?
Gruß, noisefloor
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 18:34
von Dennis89
Hallo,
noisefloor hat geschrieben: Freitag 10. Mai 2024, 17:20
Code: Alles auswählen
...
variable = ["irgendeine Aufgabe"]
frage = "Ω={
...
frage=frage.format(*variable)
kann doch nicht funktionieren - wirft das keinen Fehler? `frage` hat keine Platzhalter für die Stringformatierung.
doch und zwar genau die aus dem dritten Beitrag hier im Thema.
Wir hatten es zwar hier schon, aber nochmal, so gehts:
Code: Alles auswählen
>>>frage = "Omega={{{}"
>>>frage.format(*variable)
'Omega={irgendeine Aufgabe'
Grüße
Dennis
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 19:33
von noisefloor
Hallo,
natürlich funktioniert etwas, wenn man funktionierenden Code schreibt - nur der Originalcode ist halt kein funktionierender Code...
Code: Alles auswählen
>>> variable = ["irgendeine Aufgabe"]
>>> frage = "Ω={"
>>> frage=frage.format(*variable)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Single '{' encountered in format string
>>>
Da fehlt bei @Pitwheazle noch das Verständnis von f-Strings bzw. der Format-Methode von Strings. Wobei sich mir noch nicht erschließt, warum man einen String in der Applikation baut, wenn man sowieso eine Template-Engine nutzt.
Gruß, noisefloor
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 20:26
von Dennis89
Ich weiß nicht genau, ob du mich ansprichst @noisefloor ,aber der Teil aus meinem Post, in dem ich den funktionierenden Code zeigte, war an @Pitwheazle gerichtet und nicht an dich.
Ich hatte dich nur zitiert, um auf die Fehlermeldung einzugehen. Nicht das du denkst, ich wollte dir die `format`-Methode erklären
Grüße
Dennis
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Freitag 10. Mai 2024, 23:21
von sparrow
Das mit der Namensgebung hatten wir ja nun ausführlich in anderen Threads. Und der Hinweis verpufft leider immer im Nichts.
@pitzwheazle: Schau bitte noch einmal meine Beitrag mit dem f-String an. Ein f-String heißt so, weil vor dem String ein "f" steht. Eine Zeichenkette mit .format() zu formatieren ist kein f-String. Benennung sind auch da wichtig.
Ein Blick in die
Dokumentation sorgt für Abhilfe.
Ob man in VSC eine Datei direkt ausführen kann, weiß ich nicht. Ich starte Programme in der Kommandozeile.
Djangos manage.py kennt den Befehl "shell". Damit startet man eine interaktive Shell mit der Konfiguration des Projektes. Wirf da einfach einen Blick in die Dokumentation.
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Samstag 11. Mai 2024, 10:55
von Pitwheazle
Dennis89 hat geschrieben: Freitag 10. Mai 2024, 18:34
Wir hatten es zwar hier schon, aber nochmal, so gehts:
Code: Alles auswählen
>>>frage = "Omega={{{}"
>>>frage.format(*variable)
'Omega={irgendeine Aufgabe'
... prima, das geht!
Das mit "{{}}" kannte ich aber auf {{{} muss man erstmal kommen!
noisefloor hat geschrieben: Freitag 10. Mai 2024, 17:20
Hat wirklich _ein_ View 6700 Zeile oder hat deine views.py 6700 Zeilen?
Da habe ich anscheinend wieder was nicht verstanden: Was ist der Unterschied? Was ist "_ein_View"? Auf jeden Fall hat besagte view.py so viele Zeilen.
sparrow hat geschrieben: Freitag 10. Mai 2024, 23:21
Ein f-String heißt so, weil vor dem String ein "f" steht. Eine Zeichenkette mit .format() zu formatieren ist kein f-String.
OK, das werde ich mir merken.
sparrow hat geschrieben: Freitag 10. Mai 2024, 23:21
Das mit der Namensgebung hatten wir ja nun ausführlich in anderen Threads. Und der Hinweis verpufft leider immer im Nichts.
Das stimmt nicht. Unzählige Nächte verbringe ich schlaflos auf der Suche nach passenden Namen!
Ich hatte gehofft die Benennung von "frage" und "einheit" oben begründet zu haben. Diese Felder bleiben oft leer. Bei Umrechnungen von Einheiten steht aber links vom Eingabefeld z.B. "2dm²=" und rechts "cm²". Das ist die häufigste Anwendung. Bei Kopfrechenaufgaben steht z.B. in "frage": "3,5+0,7=" und "einheit" bleibt leer. Wie soll ich dieses Feld eurer Meinung nach sinnvoll benennen? Hier bei den Aufgaben zur Wahrscheinlichkeitsrechnung benutze ich die beiden Felder halt auch und "P(rot)=" geht doch als Frage nach der Wahrscheinlichkeit auch - oder nicht? Und damit die User nicht nach der geschweiften Klammer auf der Bildschirmtastatur suchen müssen, habe ich es außnahmsweise im Feld "einheit" vorgegeben.
Und die Liste "variable" nimmt alle Werte (das können Zahlen aber auch Strings sein) auf, die ich in meine Aufgabentexte und auch die Hilfetexte einfüge. Die Hilfetexte werden auf Anforderung zur Laufzeit erstellt. Da diese Einfügungen sich ändern fand ich "variable" passend.
Manchmal erstelle ich auch die "frage" mit variablen - und dabei ist besagter Fehler entstanden.
Re: eine geschweifte Klammer in einem String ausgeben
Verfasst: Samstag 11. Mai 2024, 11:21
von noisefloor
Pitwheazle hat geschrieben: Samstag 11. Mai 2024, 10:55
Da habe ich anscheinend wieder was nicht verstanden: Was ist der Unterschied? Was ist "_ein_View"? Auf jeden Fall hat besagte view.py so viele Zeilen.
views.py ist eine Datei, darin sind ein oder mehrere Funktionen oder Klassen oder beides (je nach dem, ob man CBV oder FBV nutzt) und eine Funktion oder Klasse wird in dem Kontext als "view" bezeichnet, weil die Funktion oder Klasse in der urls.py an eine URL gebunden wird.
6700 Zeilen in einer Datei ist heftig. Das teilt man der Übersichtlichkeit halber besser auf mehrere Dateien auf.
Und `variable` als Variablennamen zu nehmen ist das aller generischste (=nichtssagend) was überhaupt geht. Dahinter kann alles stecken - weswegen es schlicht ungeeignet als Name ist.
Gruß, noisefloor