string.format () con marcadores de posición opcionales

Tengo el siguiente código de Python (estoy usando Python 2.7.X):

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

Obtengo una excepción KeyError porque no se especifica ‘middle’ (esto es lo esperado). Sin embargo, quiero que todos esos marcadores de posición sean opcionales. Si no se especifican los parámetros nombrados, espero que se eliminen los marcadores de posición. Así que la cadena impresa arriba debe ser:

 John,,Doe 

¿Existe una funcionalidad integrada para hacer que esos marcadores de posición sean opcionales, o se requiere un trabajo más profundo? Si es lo último, si alguien me pudiera mostrar la solución más simple, ¡lo apreciaría!

Aquí hay 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') ) ) 

Aquí hay otra opción que usa 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 prefiere usar el método str.format() más moderno, lo siguiente también funcionaría, 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 en -la vuelo 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 
 "It does{cond} contain the the thing.".format(cond="" if condition else " not") 

Pensé que agregaría esto porque ha sido una característica desde que se hizo la pregunta, la pregunta sigue apareciendo al principio de los resultados de Google y este método está integrado directamente en la syntax de Python (no se requieren importaciones ni clases personalizadas). Es una statement condicional de atajo simple. Son intuitivos de leer (cuando se mantienen simples) y a menudo es útil que hagan un cortocircuito .