Eu sou um grande fã de usar dicionários para formatar strings. Isso me ajuda a ler o formato da string que estou usando, além de me tirar proveito dos dicionários existentes. Por exemplo:
class MyClass:
def __init__(self):
self.title = 'Title'
a = MyClass()
print 'The title is %(title)s' % a.__dict__
path = '/path/to/a/file'
print 'You put your file here: %(path)s' % locals()
No entanto, não consigo descobrir a sintaxe python 3.x para fazer o mesmo (ou se isso for possível). Eu gostaria de fazer o seguinte
# Fails, KeyError 'latitude'
geopoint = {'latitude':41.123,'longitude':71.091}
print '{latitude} {longitude}'.format(geopoint)
# Succeeds
print '{latitude} {longitude}'.format(latitude=41.123,longitude=71.091)
python
string
dictionary
python-3.x
Doran
fonte
fonte
Isso é bom para você?
fonte
format_map
. Semelhante astr.format(**mapping)
, exceto quemapping
é usado diretamente e não copiado para adict
. Isto é útil se, por exemplo,mapping
é uma subclasse dictprint(**geopoint)
é o mesmo queprint(longitude=71.091, latitude=41.123)
. Em muitos idiomas, é conhecido como operador splat . Em JavaScript, é chamado de operador de propagação . Em python, não há um nome específico dado a esse operador.Para descompactar um dicionário em argumentos de palavras-chave, use
**
. Além disso, a formatação de novo estilo suporta a referência a atributos de objetos e itens de mapeamentos:fonte
'{0[latitude]} {1[latitude]} {0[longitude]} {1[longitude]}'.format(geopoint0, geopoint1)
defaultdict
e não tem todas as chavesComo o Python 3.0 e 3.1 são EOL'ed e ninguém os utiliza, você pode e deve usar
str.format_map(mapping)
(Python 3.2+):O que isso significa é que você pode usar, por exemplo, um
defaultdict
que definiria (e retornaria) um valor padrão para chaves ausentes:Mesmo que o mapeamento fornecido seja uma
dict
subclasse e não uma subclasse, isso provavelmente ainda seria um pouco mais rápido.A diferença não é grande, dado
então
é cerca de 10 ns (2%) mais rápido que
no meu Python 3.4.3. A diferença provavelmente seria maior, pois há mais chaves no dicionário e
Observe que o idioma do formato é muito mais flexível do que isso; eles podem conter expressões indexadas, acessos a atributos e assim por diante, para que você possa formatar um objeto inteiro ou 2 deles:
A partir da versão 3.6, você também pode usar as seqüências interpoladas:
Você só precisa se lembrar de usar os outros caracteres de aspas nas aspas aninhadas. Outra vantagem dessa abordagem é que ela é muito mais rápida do que chamar um método de formatação.
fonte
format
? (Dado que não é copiado para um ditado)'%(latitude)s %(longitude)s'%geopoint
;)fonte
A sintaxe do Python 2 também funciona no Python 3:
fonte
f""
ou"".format()
;)fonte
print('%(latitude)s %(longitude)s'%geopoint)
isso também é significativamente mais rápido que o outro 2'%(geopoint["latitude"])s %(geopoint["longitude"])s'%{"geopoint":geopoint}
A maioria das respostas formatou apenas os valores do ditado.
Se você também deseja formatar a chave na cadeia, use dict.items () :
Resultado:
Se você deseja formatar de forma arbitral, ou seja, não mostra os valores-chave como tuplas:
Resultado:
fonte
geopoint.items()
;)