333 votes

Quel est le meilleur moyen (idiomatique) pour vérifier le type d’une variable de Python ?

J'ai besoin de savoir si une variable en Python est une chaîne de caractères ou un dict. Il n'y a rien de mal avec le code suivant?

if type(x) == type(str()):
    do_something_with_a_string(x)
elif type(x) == type(dict()):
    do_somethting_with_a_dict(x)
else:
    raise ValueError

Mise à jour: j'ai accepté avisser de la réponse (même si je vais changer d'avis si quelqu'un explique pourquoi isinstance est préférée à l'expression "de type(x) est").

Mais grâce à nakedfanatic pour me rappeler que c'est souvent plus propre d'utiliser une dict (comme une "instruction de cas) que d'un if/elif/else de la série.

Permettez-moi de développer mon cas d'utilisation. Si une variable est une chaîne, j'ai besoin de le mettre dans une liste. Si c'est un dict, j'ai besoin d'une liste de valeurs uniques. Voici ce que j'ai trouvé:

def value_list(x):
    cases = {str: lambda t: [t],
             dict: lambda t: list(set(t.values()))}
    try:
        return cases[type(x)](x)
    except KeyError:
        return None

Si isinstance est préférée, comment voulez-vous écrire ce liste_valeurs() la fonction?

339voto

Suraj Barkale Points 1482

Que se passe-t-il si quelqu'un passe une chaîne unicode à votre fonction ? Ou une classe dérivée de dict ? Ou une classe qui implémente une interface de type dict ? Suivant le code couvre les deux premiers cas. Si vous utilisez Python 2.6 vous pouvez utiliser au lieu de selon le PEP de l’ABC.

43voto

Albert Visser Points 656

les types intégrés en Python ont construit dans les noms de :

BTW, notez l’opérateur is . Cependant, type de vérification (si vous voulez l’appeler que) se fait généralement par un test spécifique au type d’emballage dans un try-sauf clause, car il n’est pas tellement le type de la variable qui est important, mais si vous pouvez faire un petit quelque chose avec elle ou pas.

23voto

Dirk Stoop Points 2223

isInstance est préférable sur type, parce qu’elle aussi est évaluée comme True lorsque vous comparez une instance d’objet avec sa superclasse, qui signifie essentiellement que vous n’aurez jamais à spécial votre ancien code pour l’utiliser avec des sous-classes dict ou str.

Par exemple :

Bien sûr, il pourrait y avoir des situations où vous ne voudriez pas ce comportement, mais ceux sont – espérons-le – beaucoup moins fréquents que les situations où vous le souhaitez.

-3voto

nosklo Points 75862

*sigh*

Non, le typage des arguments en python n'est pas nécessaire. C'est jamais nécessaire.

Si votre code accepte une chaîne de caractères ou une dict objet, votre conception est cassé.

Qui vient du fait que si vous ne le savez pas déjà le type d'un objet dans votre propre programme, alors vous êtes en train de faire quelque chose de mal déjà.

Le typage fait mal à la réutilisation du code et réduit les performances. Avoir une fonction qui effectue des choses différentes selon le type de l'objet passé est bug et sujettes a un comportement plus difficile à comprendre et à maintenir.

Vous avez le saner options:

1) Faire une fonction unique_values qui convertit les dicts dans des listes de valeurs:

def unique_values(some_dict):
    return list(set(some_dict.values()))

Faire de votre fonction de supposer l'argument passé est toujours une liste. De cette façon, si vous avez besoin de passer d'une chaîne à la fonction, il suffit de le faire:

myfunction([some_string])

Si vous avez besoin de passer un dict, vous ne:

myfunction(unique_values(some_dict))

C'est votre meilleure option, c'est propre, facile à comprendre et à maintenir. Quelqu'un la lecture du code comprend immédiatement ce qui se passe, et vous n'avez pas pour typecheck.

2) Faire deux fonctions, l'une qui accepte les listes de chaînes de caractères, et l'autre accepte dicts. Vous pouvez faire un appel de l'autre à l'interne, dans le plus commode moyen (myfunction_dict pouvez créer une liste de chaînes de caractères et appelez - myfunction_list).

Dans tous les cas, ne pas typecheck. Il est complètement inutile et n'a qu' inconvénients. Restructurer le code au lieu de cela dans une manière que vous n'avez pas besoin de typecheck. Vous obtenez seulement des avantages en agissant de la sorte, à la fois à court et à long terme.

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