eine geschweifte Klammer in einem String ausgeben
-
- User
- Beiträge: 909
- 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.)
Hat jemand eine Idee?
(Ich weiß, dass man ein Paar geschweifter Klammern mit {{}} ausgeben kann, eine einzelne scheint aber nicht zu gehen.)
-
- User
- Beiträge: 909
- 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:
Einen Vorschlag aus stock overflow habe ich auch schon ausprobiert:
Die Fehlermeldung:
Code: Alles auswählen
Single '{' encountered in format string
you can replace '{' and '}' to their corresponding codepoint \u007b and \u007d.For example print(' \u007b \u007d') got { }
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
kannst du mehr Code zeigen, der den Fehler wirft?
Weil:
Code: Alles auswählen
>>"Ω={}".format("{")
'Ω={'
https://stackoverflow.com/questions/907 ... g-format-a
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
-
- User
- Beiträge: 909
- 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.
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
- __blackjack__
- User
- Beiträge: 13236
- 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:
Das was in Deinem Code `frage` heisst ist keine Frage und das da `einheit` heisst ist keine Einheit. Das ist schlecht.
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}'
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
-
- User
- Beiträge: 909
- Registriert: Sonntag 19. September 2021, 09:40
Hier ist ein Ausschnitt aus meinem Template:
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.
Code: Alles auswählen
<fieldset>
{{frage}}
{{form.eingabe}}
{{einheit}}
<input type="submit" value="Prüfen">
</fieldset>
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.
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.
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.
-
- User
- Beiträge: 909
- 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:
(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?
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)
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?
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.
Ich sehe da übrigens noch immer keinen f-String
Das ist ein f-String:
Code: Alles auswählen
name = "Klaus"
f"Hallo {name}"
-
- User
- Beiträge: 909
- Registriert: Sonntag 19. September 2021, 09:40
und wo packe ich diese 6680 hin?
Sorry: Visual Studio Code
da erwartet der Code wohl einen - und den nutze ich auch an einigen Stellen:
Code: Alles auswählen
[b]frage=frage.format(*variable)[/b]
- noisefloor
- User
- Beiträge: 3882
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
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.
Gruß, noisefloor
Code: Alles auswählen
...
variable = ["irgendeine Aufgabe"]
frage = "Ω={
...
frage=frage.format(*variable)
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.
Hat wirklich _ein_ View 6700 Zeile oder hat deine views.py 6700 Zeilen?Das aufgerufene view hat zwischenzeitlich 6700 Zeilen
Gruß, noisefloor
Hallo,
Wir hatten es zwar hier schon, aber nochmal, so gehts:
Grüße
Dennis
doch und zwar genau die aus dem dritten Beitrag hier im Thema.noisefloor hat geschrieben: ↑Freitag 10. Mai 2024, 17:20kann doch nicht funktionieren - wirft das keinen Fehler? `frage` hat keine Platzhalter für die Stringformatierung.Code: Alles auswählen
... variable = ["irgendeine Aufgabe"] frage = "Ω={ ... frage=frage.format(*variable)
Wir hatten es zwar hier schon, aber nochmal, so gehts:
Code: Alles auswählen
>>>frage = "Omega={{{}"
>>>frage.format(*variable)
'Omega={irgendeine Aufgabe'
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
- noisefloor
- User
- Beiträge: 3882
- 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...
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
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
>>>
Gruß, noisefloor
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
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
"When I got the music, I got a place to go" [Rancid, 1993]
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.
@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.
-
- User
- Beiträge: 909
- Registriert: Sonntag 19. September 2021, 09:40
... prima, das geht!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'
Das mit "{{}}" kannte ich aber auf {{{} muss man erstmal kommen!
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.noisefloor hat geschrieben: ↑Freitag 10. Mai 2024, 17:20 Hat wirklich _ein_ View 6700 Zeile oder hat deine views.py 6700 Zeilen?
OK, das werde ich mir merken.
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.
- noisefloor
- User
- Beiträge: 3882
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
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.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.
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