2010-08-18 3 views
2

numberofrow, sa valeur est définie dynamiquement dans le champ de formulaire.gérer une chaîne python ou une liste dynamiquement

maintenant depuis numberofrow est dans plusieurs tables, quand je reçois cette variable de la forme,

si un seul numerofrow, son d'une chaîne, par ex. numberofrow = 01

si plus d'un numberofrow, c'est une liste, par ex. numberofrow = [01, 02, 04]

Maintenant comment puis-je différencier si c'est une liste ou une chaîne dans mon code python?

pense à l'aide,

if type(numberofrow).__name__=='list': 
    #do this 
else: 
    #do this 

Merci, ensoleillé.

+2

Duplicata de http://stackoverflow.com/questions/3227552/what-is-the-pythonic-way-of-differentiating-between-a-string-and-a-list? – Johnsyweb

Répondre

5

Dans ce but, il existe un build-in appelé isinstance. Vous pouvez l'utiliser pour vérifier si un objet est une instance de cette classe (et comparé à votre solution, les super classes sont également prises en compte dans ce test).

if isinstance(numberofrow, list): 
    # do this 
else: 
    # do that 

Il est assez courant de faire quelque chose comme isinstance(numberofrow, basestring). baseString est la super classe des deux types de chaînes dans Python 2-str et unicode - et le test les fera correspondre. Vous pouvez également fournir un exemple de classes/types possibles comme isinstance(numberofrow, (list, tuple)). Ce test réussira si l'instance est une instance d'une liste ou un tuple.

1

Vous pouvez faire ce que vous avez dit, mais une meilleure façon serait:

if isinstance(numberofrow, list): 
    # do this 
else: 
    # do that 

Une alternative est d'utiliser l'objet comme une chaîne et un changement de comportement en cas de problème:

try: 
    validated = numberofrow.isdigit() 
except AttributeError: 
    # must be a list? 
    # do something else 
else: 
    # must be a string 
    # do the string thing 

Si cela agit comme une chaîne, cela n'a pas d'importance s'il s'agit d'une chaîne ou non.

+0

étant donné que le code est assez grand, est-il possible, si numberofrow est une chaîne de convertir dans une liste, avec le même nom de variable, que numberofrow, puis faire le reste du codage? – sunny

+0

@sunny, c'est une bonne idée. C'est un peu ce dont parle Alex avec l'avantage que les données sont toujours une liste. Donc, comme vous l'avez dit, si c'est une chaîne, transformez-la en liste. Vous devez faire attention car les chaînes agissent comme des listes de plusieurs façons (les deux sont des séquences et ont cette interface). –

+0

@ Eric, je l'ai eu travailler de cette façon. @Alex, je suis en train d'utiliser le framework plone. Merci à tous pour les solutions. – sunny

4

Quelle structure utilisez-vous pour obtenir cette valeur à partir du formulaire? Un bon sens serait certainement un moyen de retourner toujours une liste - en particulier, si la valeur a été saisie une seule fois, une liste d'un seul article (et éventuellement, si la valeur n'a pas été entrée du tout, une liste vide).

Par exemple, avec un bon vieux cgi, vous devriez utiliser la méthode getlist du FieldStorage exemple - form.getlist('numberofrow') au lieu de form.getvalue('numberofrow') qui se comporte comme vous le décrivez, retournant une chaîne ou une liste - et cela résoudrait tous vos problèmes beaucoup plus simplement et élégamment!

Questions connexes