[Python] conflit avec optparse

Fermé
Bob El Ahn Messages postés 42 Date d'inscription dimanche 27 février 2005 Statut Contributeur Dernière intervention 25 juillet 2007 - 4 oct. 2006 à 18:50
Bob El Ahn Messages postés 42 Date d'inscription dimanche 27 février 2005 Statut Contributeur Dernière intervention 25 juillet 2007 - 6 oct. 2006 à 02:18
Chers ccmistes,

Un petit problème avec optparse:

Je pars du principe que je dois pouvoir écrire mon code sans me soucier de comment je vais l'implémenter en ligne de commande.

J'ai une fonction pour récupérer une liste de fichier:
def getfilelist(pattern=1, *pargs):
	if pattern:
		patternlist = glob.glob((raw_input('pattern: ')))
		optionallist = list(pargs)
		filelist = patternlist + optionallist
	else:
		optionallist = list(pargs)
		filelist = optionallist
	return filelist

Bon, pas très élégant mais je fignolerai. Ca fonctionne depuis l'interpréteur python. Maintenant, j'écris un petit 'frontend' avec optparse et je termine avec:

options.pattern = 1 ou 0 (vrai ou faux) et args = liste des arguments restants.

Deja, si j'appelle la fonction avec: getfilelist(pattern=options.pattern, args) je reçois un "non-keyword argument after keyword argument", soit, c'est dans les règles, donc:
getfilelist(options.pattern, args)

Mais! maintenant optionallist est de la forme [[]]! Et ca fait tout planter.

Pour contourner ça j'ai enlevé *pargs et j'ai mis un argument à getfilelist qui doit être une liste. Ca marche mais ca dilue un peu le sens de la fonction. Et j'ai été obligé de changer mon code à cause de optparse.

Y a-t-il moyen de s'occuper de ça dans optparse lui-même?

Mir,

3 réponses

Bob El Ahn Messages postés 42 Date d'inscription dimanche 27 février 2005 Statut Contributeur Dernière intervention 25 juillet 2007 8
6 oct. 2006 à 01:57
Hm, du nouveau.

J'ai changé la fonction, elle n'est plus intéractive:
def getfilelist(argslist=[]):
		filelist = []
		map(filelist.extend, map(glob.glob, argslist))
		return filelist

Ca passe tous les éléments de argslist par glob.glob et ca les ajoute à filelist..

Au départ je me disais que il n'y aurait pas toutes les expansions du shell, comme le ~..

Si on utilise la fonction tel quel c'est vrai, mais après quelques test je me suis rendu compte que la liste des arguments positionnels de optparse prend en compte les 'shell wildcards'. [je code sous bash].

Donc si on passe ~/* comme argument à un programme, la liste de optparse sera composée de tous les éléments de votre dossier 'home'. Pour avoir ['~/*'] comme liste il faut mettre les guillemets autour sur la ligne de commande.

Autrement dit, si on utilise cette fonction avec les arguments de optparse (-->en ligne de commande) on obtient toutes les expansions du shell (et la passoire au glob.glob est un peu overkill)..

Voilà, juste quelques observations parce que je ne trouvais pas ça très clair dans la documentation de optparse. Il y a plein d'examples sur comment on initialise les options mais pas grand chose sur comment on s'en sert après.

Mir
0
Bob El Ahn Messages postés 42 Date d'inscription dimanche 27 février 2005 Statut Contributeur Dernière intervention 25 juillet 2007 8
6 oct. 2006 à 02:05
D'autre part il faut mettre des guillemets (en ligne de commande) si on utilise le caractère d'échappement "\" dans les arguments.

J'ai fait des essais: si on met pas les guillemets ça renvoie la chaine moins les \:

ex: prog \n\t ==> ['nt'] ;; prog "\n\t" ==> ['\\n\\t']

Et encore j'ai pas essayé la différence entre " et ' pour les expressions plus complexes.

En mettant les guillemets ca a l'air d'être interprété comme une raw string. Peut-être que ça dépend de la version de python/optparse?

Mir,
0
Bob El Ahn Messages postés 42 Date d'inscription dimanche 27 février 2005 Statut Contributeur Dernière intervention 25 juillet 2007 8
6 oct. 2006 à 02:18
En fait c'est même pas ça:

prog \n ==> 'n'
prog \\n ==> '\\n'
prog \\\n ==> '\\n'
prog \\\\n ==> '\\\\n'
prog '\n' ==> '\\n'
prog '\\n' ==> '\\n'
prog '\\\n' ==> '\\\\n'
prog '\\\\n' ==> '\\\\n'

*Soupir*, ah il est tard j'y réfléchirai demain..
Mir,
0