eine geschweifte Klammer in einem String ausgeben

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.
Pitwheazle
User
Beiträge: 896
Registriert: Sonntag 19. September 2021, 09:40

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.)
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

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?
Pitwheazle
User
Beiträge: 896
Registriert: Sonntag 19. September 2021, 09:40

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:

Code: Alles auswählen

Single '{' encountered in format string
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 { }
Benutzeravatar
Dennis89
User
Beiträge: 1192
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

kannst du mehr Code zeigen, der den Fehler wirft?
Weil:

Code: Alles auswählen

>>"Ω={}".format("{")
'Ω={'
Deine Fehlermeldung bringt mich auf dieses Thema, vielleicht hilft dir das weiter:
https://stackoverflow.com/questions/907 ... g-format-a

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Pitwheazle
User
Beiträge: 896
Registriert: Sonntag 19. September 2021, 09:40

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
Benutzeravatar
__blackjack__
User
Beiträge: 13190
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 896
Registriert: Sonntag 19. September 2021, 09:40

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:
Bild
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.
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

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.
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Pitwheazle
User
Beiträge: 896
Registriert: Sonntag 19. September 2021, 09:40

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?
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

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:

Code: Alles auswählen

name = "Klaus"
f"Hallo {name}"
6700 Zeilen für einen View sind 6680 zu viel.
Pitwheazle
User
Beiträge: 896
Registriert: Sonntag 19. September 2021, 09:40

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:

Code: Alles auswählen

    [b]frage=frage.format(*variable)[/b]
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

Der Code erwartet das? Du schreibst doch View und Template?!
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
Dennis89
User
Beiträge: 1192
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
Dennis89
User
Beiträge: 1192
Registriert: Freitag 11. Dezember 2020, 15:13

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 :D

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

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.
Pitwheazle
User
Beiträge: 896
Registriert: Sonntag 19. September 2021, 09:40

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.
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten