Path: csiph.com!news.swapon.de!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: ruppert@hs-worms.de Newsgroups: de.comp.lang.python Subject: Re: [Python-de] f-string Formatanweisung Date: Mon, 22 Jun 2020 14:03:43 -0000 (UTC) Organization: A noiseless patient Spider Lines: 71 Message-ID: References: <3e3c30fe-d11e-6061-2ed4-0a7015359882@behnel.de> Reply-To: ruppert@hs-worms.de Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 8bit Injection-Date: Mon, 22 Jun 2020 14:03:43 -0000 (UTC) Injection-Info: reader02.eternal-september.org; posting-host="35d033fccaeb030a30e4ea7b7d5ed05d"; logging-data="4841"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX196XUMi1Sz0KofGkpvNF0o8" User-Agent: tin/2.4.3-20181224 ("Glen Mhor") (UNIX) (Linux/4.19.0-6-amd64 (x86_64)) Cancel-Lock: sha1:9WhoMpJU197CmWnrpHh4dDxdamU= Xref: csiph.com de.comp.lang.python:5650 Stefan Behnel wrote: > Hallo nochmal, Hallo ebenfalls, > > es hilft doch durchaus, nicht nur Code zu lesen, sondern auch den Text, den > du dazu geschrieben hast. :) > > ruppert@hs-worms.de schrieb am 22.06.20 um 12:36: >> das unten befindliche Programm funktioniert mit f-String-Formatierung >> nicht so, wie ich das erwarte. Wenn ich das F-String-Format, das ich >> haben möchte, zuerst als Striing formatiere (s), sieht es richtig aus. > > Du meinst wohl diese Zeilen: > > f = "{{:0{:1d}d}} {{:0{:1d}b}} {{:0{:1d}b}}".format(dl,fw,fw) > > # s wird in der for-Schleife unten nicht interpretiert, > # sondern als string ausgegeben: > > s = 'f"' + str(f"{{i:0{dl}d}} {{gray:0{fw}b}} {{bin:0{fw}b}}") + '"' > > bzw. wenn ich mir nur den f-string ansehe: > > >>> dl = 5 > >>> fw = 6 > >>> f"{{i:0{dl}d}} {{gray:0{fw}b}} {{bin:0{fw}b}}" > '{i:05d} {gray:06b} {bin:06b}' > > Für mich sieht das soweit erstmal korrekt aus. Ich vermute, du möchtest > etwas machen, was mit .format() funktioniert aber mit f-strings nicht: Ja, genau das. > den > Formatstring programmatisch erzeugen statt hinzuschreiben, stimmt das? Ja, genau. > f-strings sind ein festes Sprachkonstrukt, das direkt in der Sprache (bzw. > im Parser) auf String-Literalen ausgewertet wird, daher ist es nicht > möglich, f-strings zu generieren. (Ok, du könntest eval() verwenden, aber > das ist recht langsam und auch fehleranfällig ??? tu's lieber nicht.) ok, danke für den Tip. Dann denke ich, den Versuch, meine Formatierung mit f-Strings hinzukriegen, kann ich aufgeben. > ".format()" dagegen wird dynamisch auf beliebigen Strings ausgewertet, > nicht nur auf Literalen. > > Du kannst .format() und f-strings aber auch mischen: > > formatiere_ausgabe = \ > f"{{i:0{dl}d}} {{gray:0{fw}b}} {{bin:0{fw}b}}".format > > print(formatiere_ausgabe(i=i, gray=gray, bin=bin)) Ja, darauf wird es hinauslaufen: f-strings verwenden, wo die funktionieren und .format()-Formatierung wo f-Strings nicht funktionieren. > > Hier ist "formatiere_ausgabe" die ".format" String-Methode, angewendet auf > meinen Formatierungsstring, den ich per f-string erzeugt habe. Wenn ich > diese Methode dann aufrufe, und meine drei Argumente übergebe, dann wird > meine Ausgabe entsprechend dem Formatierungsstring zusammengestellt. > > Stefan Viele Grüße M.Ruppert -- ruppert@hs-worms.de