Muss ich % immer escapen?

Hallo, ein Beispiel zum Einstieg. val = '15' print('Trying to keep min {perc}% free inodes'.format(perc=val)) Ist das korrektes valides PEP konformes Python? Meine Linter (pycodestyle und ruff) sind zufrieden. Alternative (und etwas ältere) Schreibweise wäre noch: val = '15' print('Trying to keep min %(perc)f%% free inodes'.format(perc=val)) print('Trying to keep min f%% free inodes'.format(val)) Der Punkt beim letzen Codeblock ist, dass das %-Zeichen ganz klar escaped werden muss. Beim ersten Codeblock scheint das nicht notwendig zu sein. Unabhängig davon, was die Linter und der Python-Interpreter dazu sagen, ist meine Frage, ob das formal korrekt ist. Oder muss ich eigentlich auch im ersten Beispiel das % escapen, wenn ich es pedantisch richtig mache möchte? In PEP3101 kann ich zum % Zeichen nichts finden. Dort wird nur beschrieben, wie man geschweifte Klammern escaped. https://peps.python.org/pep-3101/ Christian

On 2023-06-21 18:29, c.buhtz@posteo.jp <c.buhtz@posteo.jp> wrote:
ein Beispiel zum Einstieg.
val = '15' print('Trying to keep min {perc}% free inodes'.format(perc=val))
Ist das korrektes valides PEP konformes Python? Meine Linter (pycodestyle und ruff) sind zufrieden.
Ja. Warum nicht?
Alternative (und etwas ältere) Schreibweise wäre noch:
val = '15' print('Trying to keep min %(perc)f%% free inodes'.format(perc=val)) print('Trying to keep min f%% free inodes'.format(val))
Die funktionieren beide nicht.
print('Trying to keep min %(perc)f%% free inodes'.format(perc=val)) Trying to keep min %(perc)f%% free inodes print('Trying to keep min f%% free inodes'.format(val)) Trying to keep min f%% free inodes
Bringst Du das mit %-Interpolation durcheinander?
val = 15 print('Trying to keep min %f%% free inodes' % val) Trying to keep min 15.000000% free inodes print('Trying to keep min %(perc)f%% free inodes' % { "perc": val }) Trying to keep min 15.000000% free inodes
(f-Strings gibt es auch noch) hp

Hallo Petter, danke für die Rückmeldung und entschuldige meinen Bullshit-Code. Das ging daneben. OK, vielleicht ist das reale Beispiel einfacher. So habe ich print nie verwendet, aber das scheint valider Code zu sein. print(_('Trying to keep min %d%% free inodes') % minFreeInodes) Nun wollte ich das "modernisieren", auch weil die Übersetzer mit "%d%%" oft nichts anfangen können. print(_('Trying to keep min {perc}% free inodes').format(perc=minFreeInodes)) Das geht auch. Aber meine Übersetzungsplatform (Weblate 4.17) moniert hier ein Problem: Nach dem % ist ein Leerzeichen und danach kommt ein f . Weblate denkt, es müsste dort %f heißen und moniert es. Würde ich das % an der Stelle escapen meckert Weblate nicht. Liegt Weblate hier falsch bzw. ist einfach zu umodern/unflexibel? Muss ich bei dem zweiten Beispiel das % eigentlich escapen und der Python Interpreter ist hier einfach nur gnädig mit mir und lässt es mir durchgehen, obwohl es nicht Standard/PEP-konform ist? Natürlich kann ich einen einfachen Workaround machen, um Weblate zufrieden zu stellen. print(_('Trying to keep min {perc} free inodes').format(perc=f'{minFreeInodes}%')) Abgesehen von Weblate, ist die Frage hier eigentlich nur, ob ich ein % escapen muss, wenn ich die moderne Form von Format-Strings mit den geschweiften Klammern nutze? Schöne Grüße Christian

Rein aus Python Sicht brauchts kein Escaping fürs %. Ich würde aber dennoch auf F-Strings wechseln, da deutlich besser Lesbar.
minFreeInodes=123 print(f'There are {minFreeInodes}% free') There are 123% free
ggf. mit deinem Workaround:
minFreeInodes=123 minFreeInodes_percent=f'{minFreeInodes}%' print(f'There are {minFreeInodes_percent} free') There are 123% free
Am Do., 22. Juni 2023 um 14:53 Uhr schrieb <c.buhtz@posteo.jp>:
Hallo Petter,
danke für die Rückmeldung und entschuldige meinen Bullshit-Code. Das ging daneben.
OK, vielleicht ist das reale Beispiel einfacher. So habe ich print nie verwendet, aber das scheint valider Code zu sein.
print(_('Trying to keep min %d%% free inodes') % minFreeInodes)
Nun wollte ich das "modernisieren", auch weil die Übersetzer mit "%d%%" oft nichts anfangen können.
print(_('Trying to keep min {perc}% free inodes').format(perc=minFreeInodes))
Das geht auch. Aber meine Übersetzungsplatform (Weblate 4.17) moniert hier ein Problem: Nach dem % ist ein Leerzeichen und danach kommt ein f . Weblate denkt, es müsste dort %f heißen und moniert es. Würde ich das % an der Stelle escapen meckert Weblate nicht.
Liegt Weblate hier falsch bzw. ist einfach zu umodern/unflexibel? Muss ich bei dem zweiten Beispiel das % eigentlich escapen und der Python Interpreter ist hier einfach nur gnädig mit mir und lässt es mir durchgehen, obwohl es nicht Standard/PEP-konform ist?
Natürlich kann ich einen einfachen Workaround machen, um Weblate zufrieden zu stellen.
print(_('Trying to keep min {perc} free inodes').format(perc=f'{minFreeInodes}%'))
Abgesehen von Weblate, ist die Frage hier eigentlich nur, ob ich ein % escapen muss, wenn ich die moderne Form von Format-Strings mit den geschweiften Klammern nutze?
Schöne Grüße Christian _______________________________________________ python-de Mailingliste -- python-de@python.org Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an python-de-leave@python.org https://mail.python.org/mailman3/lists/python-de.python.org/ Mitgliedsadresse: python@qupfer.de

On 2023-06-22 12:52, c.buhtz@posteo.jp <c.buhtz@posteo.jp> wrote:
Hallo Petter,
Nur ein t. Ich wohne vermutlich südlich von dir, nicht nördlich ;-).
danke für die Rückmeldung und entschuldige meinen Bullshit-Code. Das ging daneben.
OK, vielleicht ist das reale Beispiel einfacher. So habe ich print nie verwendet, aber das scheint valider Code zu sein.
print(_('Trying to keep min %d%% free inodes') % minFreeInodes)
Nun wollte ich das "modernisieren", auch weil die Übersetzer mit "%d%%" oft nichts anfangen können.
print(_('Trying to keep min {perc}% free inodes').format(perc=minFreeInodes))
Das geht auch. Aber meine Übersetzungsplatform (Weblate 4.17) moniert hier ein Problem: Nach dem % ist ein Leerzeichen und danach kommt ein f . Weblate denkt, es müsste dort %f heißen und moniert es.
Sagt es: "Das ist falsch" oder "Das schaut verdächtig aus, könnte ein Tippfehler sein, schau Dir das noch einmal an"?
Würde ich das % an der Stelle escapen meckert Weblate nicht.
Wie würdest Du das denn escapen?
Liegt Weblate hier falsch bzw. ist einfach zu umodern/unflexibel?
Möglich. Kann man Weblate sagen, welcher Syntax diese Strings gehorchen sollen? Das ist ja von Programmiersprache zu Programmiersprache unterschiedlich und selbst innerhalb der gleichen Programmiersprache gibt es oft mehrere Möglichkeiten (wie man hier sieht). Offensichtlich glaubt Weblate, dass der String entweder für die C-Funktion printf oder den Python-Operator % oder etwas ähnliches gedacht ist. Das ist hier aber nicht der Fall.
Muss ich bei dem zweiten Beispiel das % eigentlich escapen
Nein. Das %-Zeichen hat für str.format() keine spezielle Bedeutung. Du kannst es daher IMHO auch gar nicht escapen. (Du könntest natürlich "\x25" statt "%" schreiben, kann sein dass das Weblate zufriedenstellt, aber für Python ist es genau das Gleiche).
und der Python Interpreter ist hier einfach nur gnädig mit mir und lässt es mir durchgehen, obwohl es nicht Standard/PEP-konform ist?
Kleine Anmerkung: PEP-008 ist ein Styleguide für die Python-Library. Die ist für Leute, die Module schreiben, die Teil des Python-Standard-Pakets sind, mehr oder weniger verpflichtend (es gibt auch dort alten Code, der nicht PEP-008-konform ist). Für alle anderen ist das bestenfalls eine freundliche Empfehlung. Code, der sich nicht an diese Empfehlung hält ist deshalb nicht falsch und der Python-Interpreter wird das nie anmeckern. (Linter schon, denn deren Zweck ist es ja, zu meckern, und die sind erstens konfigurierbar und zweitens kann sich der Entwickler aussuchen, ob er überhaupt einen verwendet, wenn ja, welchen und mit welchen Optionen, und was er dann mit dem Ergebnis macht.) Abgesehen davon sind alle drei Formatierungsmöglichkeiten ok. Keine ist veraltet oder nicht empfehlenswert. hp

Hallo Peter, danke für deine Hilfe bei dem Thema. Am 22.06.2023 15:58 schrieb Peter J. Holzer:
Sagt es: "Das ist falsch" oder "Das schaut verdächtig aus, könnte ein Tippfehler sein, schau Dir das noch einmal an"?
Gute Frage. Es ist ein "Check". Weblate zeigt eine rote Headlne "Things to check". Also kein Error in dem Sinne. Konkret sind es vier Meldungen, die für den technisch kaum bis gar nicht versierten Übersetzenden überhaut nicht hilfreich sind und am Ende dann ich als Maintainer Hand anlegen muss. Following format strings are missing: % f Following format strings are extra: %% Following format strings are extra: %d Following format strings are missing: {perc} Hier mal ein Beispiel: https://translate.codeberg.org/translate/backintime/common/da/?checksum=1724... Egal. Ich nutze den Workaround und habe bei Weblate in Ticket aufgemacht. Schöne Grüße Christian

On 2023-06-22 14:14, c.buhtz@posteo.jp <c.buhtz@posteo.jp> wrote:
Am 22.06.2023 15:58 schrieb Peter J. Holzer:
Sagt es: "Das ist falsch" oder "Das schaut verdächtig aus, könnte ein Tippfehler sein, schau Dir das noch einmal an"?
Gute Frage. Es ist ein "Check". Weblate zeigt eine rote Headlne "Things to check". Also kein Error in dem Sinne. Konkret sind es vier Meldungen, die für den technisch kaum bis gar nicht versierten Übersetzenden überhaut nicht hilfreich sind und am Ende dann ich als Maintainer Hand anlegen muss.
Following format strings are missing: % f Following format strings are extra: %% Following format strings are extra: %d Following format strings are missing: {perc}
Hier mal ein Beispiel:
https://translate.codeberg.org/translate/backintime/common/da/?checksum=1724...
Ich kenne Weblate nicht und verstehe vielleicht die Meldungen falsch, aber ich glaube, die beziehen sich auf den Unterschied zwischen Original und Übersetzung. Die Übersetzung von Trying to keep min {perc}% free inodes müsste IMHO lauten Prøv at beholde minimum {perc}% inoder fri Da da aber Prøv at beholde minimum %d%% inoder fri steht, meckert Weblate an, dass da unerwarteterweise "%d" und "%%" vorkommen und dafür "{perc}" fehlt. (und auch, dass "% f" fehlt, aber das ist ein Fehler) hp
participants (3)
-
c.buhtz@posteo.jp
-
Henning Reich
-
Peter J. Holzer