2012-06-13 14 views
12

Tengo el siguiente código Python (estoy usando Python 2.7.x):string.format() con marcadores de posición opcionales

my_csv = '{first},{middle},{last}' 
print(my_csv.format(first='John', last='Doe')) 

I Get a excepción KeyError porque 'medio' no se especifica (esto es esperado). Sin embargo, quiero que todos esos marcadores de posición sean opcionales. Si esos parámetros nombrados no se especifican, espero que los marcadores de posición se eliminen. Por lo que la cadena de impresión anterior debería ser:

John,,Doe 

¿Hay construido en la funcionalidad para hacer esos marcadores de posición opcional, o hay algo más de profundidad en el trabajo requiere? Si esto último, ¡si alguien pudiera mostrarme la solución más simple, lo agradecería!

Respuesta

14

Aquí es una opción:

from collections import defaultdict 

my_csv = '{d[first]},{d[middle]},{d[last]}' 
print(my_csv.format(d=defaultdict(str, first='John', last='Doe'))) 
+0

Veo que está usando 'str'. ¿Que es esto? Editar: ahora veo que este es el método de fábrica, no un nombre de variable. Entonces, la fábrica creará cadenas en blanco. –

5

Aquí es otra opción que utiliza el operador de interpolación de cadenas %:

class DataDict(dict): 
    def __missing__(self, key): 
     return '' 

my_csv = '%(first)s,%(middle)s,%(last)s' 
print my_csv % DataDict(first='John', last='Doe') # John,,Doe 

Alternativamente, si se prefiere usar el más moderno método str.format(), lo siguiente sería también funciona, pero es menos automático en el sentido de que habrá definido explícitamente cada marcador de posición posible por adelantado (aunque podría modificar DataDict.placeholders on-th e-volar si se desea):

class DataDict(dict): 
    placeholders = 'first', 'middle', 'last' 
    default_value = '' 
    def __init__(self, *args, **kwargs): 
     self.update(dict.fromkeys(self.placeholders, self.default_value)) 
     dict.__init__(self, *args, **kwargs) 

my_csv = '{first},{middle},{last}' 
print(my_csv.format(**DataDict(first='John', last='Doe'))) # John,,Doe 
Pensamiento
2
"It does{cond} contain the the thing.".format(cond="" if condition else " not") 

me gustaría añadir esto porque ha sido una característica ya se hizo la pregunta, la pregunta sigue aparece temprano en los resultados de Google, y este método se construye directamente en la sintaxis de python (no se requieren importaciones ni clases personalizadas). Es un simple shortcut conditional statement. Son intuitivos para leer (cuando se mantienen simples) y a menudo es útil que short-circuit.

+0

Si bien siempre se agradecen las respuestas, esta pregunta fue hecha y respondida hace 5 años, y ya tenía una solución aceptada. También ayuda a proporcionar información sobre cómo su código resuelve el problema. Proporcione algún [contexto que rodee su respuesta] (https://meta.stackexchange.com/a/148274), y vea el [artículo de ayuda] (http://stackoverflow.com/help/how-to-answer) para información sobre cómo escribir excelentes respuestas :) –

Cuestiones relacionadas