Formato de cadenas en Python 3
Hago esto en Python 2:
"(%d goals, $%d)" % (self.goals, self.penalties)
¿Cuál es la versión Python 3 de esto?
Intenté buscar ejemplos en línea pero seguía obteniendo versiones de Python 2.
Aquí están los documentos sobre la sintaxis del formato "nuevo". Un ejemplo sería:
"({:d} goals, ${:d})".format(self.goals, self.penalties)
Si ambos goals
y penalties
son números enteros (es decir, su formato predeterminado está bien), se podría acortar a:
"({} goals, ${})".format(self.goals, self.penalties)
Y dado que los parámetros son campos de self
, también hay una manera de hacerlo usando un solo argumento dos veces (como señaló @Burhan Khalid en los comentarios):
"({0.goals} goals, ${0.penalties})".format(self)
Explicando:
{}
significa sólo el siguiente argumento posicional, con formato predeterminado;{0}
significa el argumento con índice0
, con formato predeterminado;{:d}
es el siguiente argumento posicional, con formato de entero decimal;{0:d}
es el argumento con índice0
, con formato de entero decimal.
Hay muchas otras cosas que puede hacer al seleccionar un argumento (usar argumentos con nombre en lugar de posicionales, acceder a campos, etc.) y también muchas opciones de formato (rellenar el número, usar separadores de miles, mostrar signo o no, etc.). Algunos otros ejemplos:
"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)
"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)
"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'
"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'
"games: {:>3}".format(player1.games) # 'games: 123'
"games: {:>3}".format(player2.games) # 'games: 4'
"games: {:0>3}".format(player2.games) # 'games: 004'
Nota: Como otros señalaron, el nuevo formato no reemplaza al anterior, ambos están disponibles tanto en Python 3 como también en las versiones más recientes de Python 2. Algunos pueden decir que es una cuestión de preferencia, pero en mi humilde opinión, el más nuevo es mucho más expresivo que el anterior y debe usarse siempre que se escriba código nuevo (a menos que esté dirigido a entornos más antiguos, por supuesto).
Python 3.6 ahora admite la interpolación de cadenas literales abreviadas con PEP 498 . Para su caso de uso, la nueva sintaxis es simplemente:
f"({self.goals} goals, ${self.penalties})"
Esto es similar al .format
estándar anterior, pero permite hacer fácilmente cosas como :
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result: 12.35'