2009-06-21 8 views
29

En Python 2.6, le code suivant:Comment arrêter Python parse_qs d'analyser des valeurs uniques dans des listes?

import urlparse 
qsdata = "test=test&test2=test2&test2=test3" 
qs = urlparse.parse_qs(qsdata) 
print qs 

donne la sortie suivante:

{'test': ['test'], 'test2': ['test2', 'test3']} 

Ce qui signifie que même si il n'y a qu'une seule valeur pour le test, il est encore en cours d'analyse dans une liste . Y at-il un moyen de s'assurer que s'il n'y a qu'une seule valeur, elle n'est pas analysée dans une liste, de sorte que le résultat ressemblerait à ceci?

{'test': 'test', 'test2': ['test2', 'test3']} 
+10

N'est-il pas plus cohérent que toutes les valeurs soient listées et vous n'avez pas à vous inquiéter s'il s'agit d'une liste ou d'une seule valeur, pourquoi voudriez-vous le contraire? –

+3

Le standard HTTP signifie qu'il doit s'agir d'une liste. Il ne semble pas y avoir beaucoup d'alternatives. –

Répondre

24

Vous pouvez le réparer par la suite ...

import urlparse 
qsdata = "test=test&test2=test2&test2=test3" 
qs = dict((k, v if len(v)>1 else v[0]) 
      for k, v in urlparse.parse_qs(qsdata).iteritems()) 
print qs 

Cependant, je ne pense pas que je voudrais cela. Si un paramètre qui est normalement une liste n'arrive qu'avec un seul ensemble d'éléments, alors j'aurais une chaîne au lieu de la liste de chaînes que je reçois normalement.

99

sidenote pour quelqu'un qui veut juste un dictionnaire simple et jamais besoin de plusieurs valeurs avec la même clé, essayez:

dict(urlparse.parse_qsl('foo=bar&baz=qux')) 

Cela vous donnera une belle {'foo': 'bar', 'baz': 'qux'}. S'il vous plaît noter que s'il sont plusieurs valeurs pour la même clé, vous obtiendrez seulement le dernier.

+0

Est-ce que 'parse_qsl()' ne vous donne pas une liste de paires clé-valeur (et non une dict)? –

+11

@MisterBhoot Oui, c'est pourquoi j'ai l'appel 'dict (...)'. :) – tuomassalo

+0

Mon mauvais, désolé. Je devrais commencer à dormir tôt maintenant. –

Questions connexes