2012-11-23 1 views
1

J'ai un programme qui prend en arguments de la forme filename:field[slice], qui fonctionne bien. Mais je souhaite également soutenir la notation commune qu'un nom de fichier de - signifie l'entrée standard. Malheureusement, -:field[slice] s'enregistre comme une option avec optparse (naturellement), et n'apparaît donc pas comme un argument positionnel. Je me demande donc s'il y a un moyen de contourner cela, par exemple en disant à optparse que les options commençant par -: devraient être traitées comme des arguments positionnels après tout. La solution doit conserver l'ordre des arguments, de sorte que foo:bar -:cow baz:dog ne devienne pas foo:bar baz:dog -:cow.Faire optparse traiter certaines options comme des arguments de position

Répondre

2

Il me semble que votre meilleure option est de pré-traiter sys.argv en insérant un jeton spécial que vous vérifiez au lieu de -.

args = [ '<stdin>:'+x[2:] if x.startswith('-:') else x for x in sys.argv[1:] ] 
opt_struct = parser.parse_args(args) 

Dans ce cas, vous analyser <stdin> comme entrée standard dans votre programme au lieu de -.

La transformation devient un peu plus compliquée si le : et les trucs qui le suivent sont optionnels, mais c'est l'essentiel de toute façon.

9 fois sur 10, ces problèmes sont probablement impossibles à résoudre avec optparse, vraiment délicat/désordre à résoudre avec argparse et trivial à résoudre par prétraiter sys.argv - Mais peut-être est juste mon expérience ...

+0

Merci pour la solution élégante, cela a fonctionné comme un charme (sauf que j'ai dû utiliser 'sys.argv [1:]')! – amaurea

+0

@amaurea - à droite. 'sys.argv [1:]'. J'ai mis à jour le post. Merci pour la correction :) – mgilson

Questions connexes