Cadena f multilínea en Python

86

Estoy tratando de escribir código compatible con PEP-8 para un proyecto doméstico (debo admitir que esos son mis primeros pasos en el mundo de Python) y tengo una cadena f que tiene más de 80 caracteres de largo

- la línea delgada y sólida cerca del punto en selftext es la marca de 80 caracteres. (Lo siento por el enlace triste sin vista previa, pero debo tener más de 10 representantes para publicarlos)

Estoy tratando de dividirlo en diferentes líneas de la manera más pitónica , pero la única respuesta que realmente funciona es un error para mi linter.

Código de trabajo:

def __str__(self):
    return f'{self.date} - {self.time},\nTags:' + \
    f' {self.tags},\nText: {self.text}'

Salida:

2017-08-30 - 17:58:08.307055,
Tags: test tag,
Text: test text

El linter piensa que no estoy respetando E122 de PEP-8, ¿hay alguna manera de hacer que la cadena sea correcta y el código sea compatible?

Búho
fuente
1
o simplemente dile a tu ide que aumente el límite de caracteres de línea, o ignora esa regla por completo
Joran Beasley
21
No siento que sea un engaño ... las fcuerdas no se discuten allí.
Ma0
3
@JoshLee "A la línea de continuación E122 le falta sangría o la línea principal no está abollada" ¿también por qué cerró la pregunta? No hay duplicados, es el único sobre cadenas f de
varias líneas
2
@Owlzy ¿No es la respuesta exactamente la misma: use paréntesis, no el marcador de continuación de línea?
Nick T
8
Esta pregunta nunca debería haberse cerrado como un engaño, ya que el 'engañado' vinculado no es un engaño de esta pregunta. Usuarios avanzados de Stackoverflow que saben que tenemos un problema por ser demasiado agresivos como este, hagan que vuelva a abrirlo. Emitir un voto de reapertura lo antes posible.
Urda

Respuestas:

97

De la Guía de estilo para código Python :

La forma preferida de envolver líneas largas es usando la continuación de línea implícita de Python entre paréntesis, corchetes y llaves.

Dado esto, lo siguiente resolvería su problema de una manera compatible con PEP-8.

return (
    f'{self.date} - {self.time}\n'
    f'Tags: {self.tags}\n'
    f'Text: {self.text}'
)

Las cadenas de Python se concatenarán automáticamente cuando no estén separadas por una coma, por lo que no es necesario llamar explícitamente join().

bobo
fuente
40

creo que sería

return f'''{self.date} - {self.time},
Tags: {self.tags},
Text: {self.text}'''
Joran Beasley
fuente
ahora que está cerrado, puedo eliminar esta respuesta si la gente piensa que debería ... pero no está cubierto en la respuesta dupe: / \
Joran Beasley
8
pero este tipo de
líneas múltiples anula
2
Si bien esta respuesta replica la intención del OP, siento que la respuesta de @ noddy es mejor. Esta respuesta resulta ser correcta porque el OP también quería varias líneas en la salida. Si desea que la salida tenga un diseño diferente al del código fuente, las comillas triples no son el camino a seguir.
Mike Williamson
10

Puede utilizar comillas triples simples o dobles comillas triples, pero coloque una f al principio de la cadena:

Cotizaciones Triple Individual

return f'''{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}'''

Cotizaciones Triple Doble

return f"""{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}"""

Observe que no necesita usar "\ n" porque está usando una cadena de varias líneas.

lmiguelvargasf
fuente
8

Como lo menciona @noddy, el enfoque también funciona para la expresión de asignación de variable:

var1 = "foo"
var2 = "bar"
concat_var = (f"First var is: {var1}"
              f" and in same line Second var is: {var2}")
print(concat_var)

debería darte:

First var is: foo and in same line Second var is: bar
codarrior
fuente