Necesito escribir un código que tome un objeto JavaScript y escriba una cadena que sea un dictado de Python3 válido y atractivo. Si es posible, deseo hacer esto sin dependencias externas.
Mi implementación actual es la siguiente:
const TRUE_PLACEHOLDER = "__replace_me_true__"; const FALSE_PLACEHOLDER = "__replace_me_false__"; const booleanToPlaceholderReplacer = (key, val) => val === true ? TRUE_PLACEHOLDER : val === false ? FALSE_PLACEHOLDER : val; const objToPythonDictStr = (obj) => JSON.stringify(obj, booleanToPlaceholderReplacer, 4) .replaceAll(`"${TRUE_PLACEHOLDER}"`, "True") .replaceAll(`"${FALSE_PLACEHOLDER}"`, "False"); Un resultado de ejemplo de objToPythonDictStr que demuestra que parece funcionar bien:
>> console.log(objToPythonDictStr({foo: 1, bar: false, baz: { baz2: true }})) { "foo": 1, "bar": False, "baz": { "baz2": True } }(Nota: un problema obvio con mi código es que si cualquiera de las cadenas de marcador de posición se usa como cadenas reales en los datos, se reemplazarán incorrectamente. Esto es bastante poco probable en mi caso de uso y estoy de acuerdo con ese riesgo, pero estoy abierto a una mejor implementación que eliminaría esta falla si no conduce a una implementación mucho más compleja).
Suponiendo que el objeto pasado a objToPythonDictStr es un objeto JSON serializable, ¿mi objToPythonDictStr es razonable y correcto?
Específicamente, ¿existen incompatibilidades en la salida de la serialización JSON y la sintaxis de dictado de Python, además de la representación booleana, que causarán problemas al usar la metodología hacky que se muestra arriba?
Python ya ofrece un json.loads(str) para analizar cadenas JSON válidas en objetos de Python, no hay motivo para hacerlo del lado de JS.
Al menos una cosa que le falta a su función es la diferencia entre el valor nulo en las cadenas JSON y el equivalente de Python de Ninguno