Estoy tratando de integrar argparse en mi programa Javascript, de modo que todos los argumentos se puedan cargar desde un archivo de configuración externo, y luego esos valores se pueden anular con los argumentos CLI proporcionados posteriormente. Para hacer esto, decidí leer un archivo de configuración y analizarlo en un objeto JSON, luego iterar a través de las claves y establecer los valores predeterminados en el analizador, y finalmente analizar los argumentos CLI restantes para anular los valores predeterminados. Desafortunadamente, estoy recuperando un comportamiento extraño, y dado que es un puerto del repositorio de Python, no hay mucha documentación relevante sintácticamente ( https://www.npmjs.com/package/argparse )
Tengo la siguiente lógica:
//readFile helper method not shown const configArgs = JSON.parse(readFile('config.json')) for (let key in configArgs) { let value = configArgs[key] //used for debugging console.log(`${key}: ${value}`) parser.set_defaults({key: value}) } var args = parser.parse_args() //used for debugging console.log(args) Sin embargo, parece que la línea parser.set_defaults() no funciona correctamente:
path: ../data/testInput.txt json: ../build/testSet.json name: foo.txt output: output.txt Namespace(path=undefined, json=undefined, name=undefined, output=undefined, key='output.txt') ¿Por qué está tratando de crear una nueva "clave" de opción de configuración, aunque la key pasada a set_defaults() es una variable y tiene un valor nuevo cada vez que se registra en la consola?
Contribuí a este repositorio hace años, pero no he trabajado con él ni con javascript recientemente.
En python argparse , creo que esto es lo que quieres hacer:
In [27]: conf = {'path': '../data/testInput.txt', ...: 'json': '../build/testSet.json', ...: 'name': 'foo.txt', ...: 'output': 'output.txt'} In [28]: parser = argparse.ArgumentParser() In [29]: for k in conf.keys(): ...: print(k,conf[k]) ...: parser.set_defaults(**{k:conf[k]}) ...: path ../data/testInput.txt json ../build/testSet.json name foo.txt output output.txt In [30]: parser.parse_args([]) Out[30]: Namespace(path='../data/testInput.txt', json='../build/testSet.json', name='foo.txt', output='output.txt')o simplemente configure todas las teclas a la vez:
In [31]: parser = argparse.ArgumentParser() In [32]: parser.set_defaults(**conf) In [33]: parser.parse_args([]) Out[33]: Namespace(path='../data/testInput.txt', json='../build/testSet.json', name='foo.txt', output='output.txt') En Python (**conf) es equivalente a (path='..data...', json='../build', etc) .
La acción de set_defaults es agregar al atributo _defaults :
In [34]: parser._defaults Out[34]: {'path': '../data/testInput.txt', 'json': '../build/testSet.json', 'name': 'foo.txt', 'output': 'output.txt'}El código de Python es:
def set_defaults(self, **kwargs): self._defaults.update(kwargs) # and set defaults of actions if anyEl código javascript correspondiente es:
set_defaults(kwargs) { Object.assign(this._defaults, kwargs) # and set action.default if anyNo recuerdo suficiente javascript para decir si eso es correcto o no.