xticks barplot python python-3.x multiline with-statement

python - barplot - pandas plot



Python multilínea con declaración (3)

¿Cuál es una forma limpia de crear una multilínea with python? Quiero abrir varios archivos dentro de un solo with , pero es lo suficientemente a la derecha que lo quiero en varias líneas. Me gusta esto:

class Dummy: def __enter__(self): pass def __exit__(self, type, value, traceback): pass with Dummy() as a, Dummy() as b, Dummy() as c: pass

Desafortunadamente, eso es un SyntaxError . Así que intenté esto:

with (Dummy() as a, Dummy() as b, Dummy() as c): pass

También un error de sintaxis. Sin embargo, esto funcionó:

with Dummy() as a, Dummy() as b,/ Dummy() as c: pass

Pero ¿y si quisiera hacer un comentario? Esto no funciona:

with Dummy() as a, Dummy() as b,/ # my comment explaining why I wanted Dummy() as c/ Dummy() as c: pass

Tampoco hay ninguna variación obvia en la colocación de los / s.

¿Hay una forma limpia de crear una línea múltiple with declaración que permita comentarios dentro de ella?


Dado que ha etiquetado este Python 3, si necesita intercalar comentarios con sus gestores de contexto, usaría un contextlib.ExitStack :

with ExitStack() as stack: a = stack.enter_context(Dummy()) # Relevant comment b = stack.enter_context(Dummy()) # Comment about b c = stack.enter_context(Dummy()) # Further information

Esto es equivalente a

with Dummy() as a, Dummy() as b, Dummy() as c:

Esto tiene la ventaja de que puede generar sus administradores de contexto en un bucle en lugar de tener que enumerarlos por separado. La documentación da el ejemplo de que si desea abrir un montón de archivos, y tiene los nombres de archivo en una lista, puede hacerlo

with ExitStack() as stack: files = [stack.enter_context(open(fname)) for fname in filenames]

Si sus administradores de contexto ocupan tanto espacio en la pantalla que desea colocar comentarios entre ellos, es probable que tenga suficiente para usar algún tipo de bucle.

Como el Sr. Deathless menciona en los comentarios, hay un backport contextlib en PyPI bajo el nombre contextlib2 . Si estás en Python 2, puedes usar la implementación de ExitStack de ExitStack .


Esto me parece más ordenado:

with open(''firstfile'', ''r'') as (f1 # first ), open(''secondfile'', ''r'') as (f2 # second ): pass


Esto no es exactamente limpio, pero podrías hacer esto:

with Dummy() as a, Dummy() as b, ( #my comment Dummy()) as c: pass

No hay errores de sintaxis, pero no es el más limpio. También podrías hacer esto:

with Dummy() as a, Dummy() as b, Dummy( #my comment ) as c: pass

Considere la posibilidad de encontrar una manera de hacer esto sin usar los comentarios en el medio de.