Según la documentación del módulo de keyword
, se han agregado dos nuevos miembros en Python 3.9:
issoftkeyword
softkwlist
Sin embargo, su documentación no revela nada sobre su propósito. Este cambio ni siquiera se menciona en el artículo Novedades , donde normalmente se documentan todos los cambios de la API. Profundizar un poco más en el código fuente finalmente conduce a esta solicitud de incorporación de cambios en la que se menciona que "esencialmente se trata de una herramienta interna" y que "todavía no se utilizan palabras clave blandas" . Entonces, ¿cuál es el propósito de las palabras clave blandas de Python?
Breve: las palabras clave blandas aún se pueden usar como nombres de variables o argumentos.
PEP 622 arroja algo de luz (Énfasis mío):
La diferencia entre las palabras clave duras y blandas es que las palabras clave duras siempre son palabras reservadas, incluso en posiciones donde no tienen sentido (por ejemplo, x = clase + 1), mientras que las palabras clave blandas solo obtienen un significado especial en contexto.
[...] Las palabras clave de coincidencia y caso se proponen como palabras clave blandas , de modo que se reconozcan como palabras clave al comienzo de una declaración de coincidencia o bloque de caso respectivamente, pero se permite su uso en otros lugares como nombres de variables o argumentos .
Las palabras clave blandas son palabras clave que son sensibles al contexto. Por ejemplo, le permitiría usar class
como nombre de variable siempre que no se pueda interpretar como una definición de clase. Permitiría usar para reemplazar cls
con class
por ejemplo.
Hoy eso no es posible, ya que class
es una palabra clave:
>>> def a(class): File "<stdin>", line 1 def a(class): ^
Dado el contexto, está claro que el usuario no tenía la intención de definir una nueva clase, sino que quería un identificador llamado class
.
Creo que esto se explica mejor con una demostración. async
y await
eran palabras clave blandas en Python 3.5 y 3.6 y, por lo tanto, podían usarse como identificadores:
>>> async = "spam" >>> async def foo(): ... pass ... >>> await = "bar" >>> async, await ('spam', 'bar')
Pero en Python 3.7 se convirtieron en palabras clave adecuadas y solo se pueden usar en contextos específicos donde tienen sentido:
>>> async = "123" File "<stdin>", line 1 async = "123" ^ SyntaxError: invalid syntax >>> async def foo(): ... pass ... >>> await = "bar" File "<stdin>", line 1 await = "bar" ^ SyntaxError: invalid syntax >>> async, await File "<stdin>", line 1 async, await ^ SyntaxError: invalid syntax
La idea de presentarlas por primera vez como palabras clave blandas fue principalmente no romper ningún código existente que las use como identificadores. El mismo razonamiento es con la próxima palabra clave de match
que rompería por completo, por ejemplo re.match
y millones de proyectos.