2 votes

Comment avoir un nombre variable de paramètres en utilisant `argparse` pour nim

J'ai commencé aujourd'hui à apprendre nim, donc toute sorte de suggestion est la bienvenue.

J'ai essayé d'utiliser argparse en pensant que sa similarité avec la bibliothèque de Python rendrait ma vie plus facile.

J'aimerais avoir une application avec cette interface :

tool [options] File1 File2 ... FileN

mon objet analyseur est comme suit :

var p = newParser(prog):
  help("Développer les fichiers FASTA (et FASTQ), imprimer triés par taille de cluster avec la décoration ';size=NNN'.")
  flag("-k", "--keep-name", help="Ne pas renommer la séquence, mais utiliser le premier nom de séquence")
  flag("-i", "--ignore-size", help="Ne pas tenir compte des annotations 'size=INT;' (elles seront supprimées de toute façon)")
  option("-m", "--min-size", help="Imprimer les clusters avec une taille égale ou supérieure à INT séquences", default="0")
  option("-p", "--prefix", help = "Préfixe du nom de séquence", default = "seq")
  option("-s", "--separator", help = "Séparateur de nom de séquence", default = ".")
  flag("-c", "--size-as-comment", help="Imprimer la taille du cluster en commentaire, pas dans le nom de séquence")
  arg("inputfile", help="Fichier d'entrée")

Je recherche quelque chose comme nargs="+", mais d'après ce que j'ai compris, un entier est attendu, et je n'ai pas compris comment spécifier un nombre arbitraire d'entrées.

Merci !

PS:

  • L'outil que j'utilise pour expérimenter se trouve ici

3voto

xbello Points 1275

Vous pouvez le faire en ajoutant nargs=-1:

import os
import argparse

proc main(args: seq[string]) =
  var par = newParser("My Program"):
    option("--arg1")
    arg("files", nargs = -1)

  var opts = par.parse(args)
  echo "Opts: ", opts.arg1
  echo "Files: ", opts.files
  # Pour une commande comme `cmd --arg1=X file1 file2, écho
  # Opts: X
  # Files: @[file1, file2]

when isMainModule:
  main(commandLineParams())

Si vous voulez, disons au moins un FASTA, mais beaucoup plus possible, voici la syntaxe :

var par = newParser("My Program"):
  option("--arg1")
  arg("firstFile")
  arg("otherFiles", nargs = -1)

Maintenant par.firstFile contient une chaîne avec le premier fichier, et par.otherFiles contient un seq[string] avec le reste d'entre eux.


Rappelez-vous que Nim a son propre analyseur de ligne de commande, qui semble un peu complexe au début, mais pour des choses simples, cela peut être utile :

import os
import parseopt

proc main(args: seq[string]) =
  var par = initOptParser(args)
  var files: seq[string>

  for kind, key, val in args.getopt():
    case kind
    of cmdLongOption, cmdShortOption:
      # Ici, vous traitez avec des options comme --option et -o
      discard
    of cmdArgument:
      # Ici, tout argument supplémentaire est ajouté à la séquence
      files.add key
    of cmdEnd: assert(false)

  echo files

when isMainModule:
  main(commandLineParams())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X