Io di solito uso il seguente schema (come indicato nel this question):abbreviazione di String.Format (..., ** locals())
a=1
s= "{a}".format(**locals())
Penso che sia un ottimo modo per scrivere facilmente leggibile codice.
A volte è utile per formati di stringa "catena", al fine di "rendere modulare" la creazione di stringhe complesse:
a="1"
b="2"
c="{a}+{b}".format(**locals())
d="{c} is a sum".format(**locals())
#d=="1+2 is a sum"
Abbastanza presto, il codice è importunano con X.format(**locals())
. Per risolvere questo problema, ho cercato di creare un lambda:
f= lambda x: x.format(**locals())
a="1"
b="2"
c= f("{a}+{b}")
d= f("{c} is a sum")
ma questo getta un KeyError, dal momento che locals()
sono i locali del lambda.
Ho anche cercato di applicare il formato solo nell'ultima stringa:
a="1"
b="2"
c="{a}+{b}"
d="{c} is a sum".format(**locals())
#d=="{a}+{b} is a sum"
Ma questo non funziona, dal momento pitone formatta solo una volta. Ora, io potrei scrivere una funzione che formatta ripetutamente fino a quando non c'è più nulla da fare:
def my_format(string, vars):
f= string.format(**vars)
return f if f==string else my_format(f, vars)
ma mi chiedo: c'è un modo migliore per fare questo?
Probabilmente vuoi che i locali scavalchino i globali. Attualmente, lo hai fatto al contrario, dal momento che gli argomenti successivi per vincere. – Collin
buon punto ... farò quel cambiamento. –