Comment «tester» NoneType en python?


398

J'ai une méthode qui renvoie parfois une valeur NoneType. Alors, comment puis-je remettre en question une variable qui est un NoneType? J'ai besoin d'utiliser la méthode if , par exemple

if not new:
    new = '#'

Je sais que c'est la mauvaise façon et j'espère que vous comprenez ce que je voulais dire.


Je pense que cela a été répondu ici et apparemment quelque part avant
yorodm

Si Noneest la seule valeur que votre méthode renvoie pour laquelle bool(returnValue)est égal False, cela if not new:devrait fonctionner correctement. Cela se produit parfois dans les re.matchbibliothèques intégrées - par exemple, retourne None ou un objet de correspondance véridique.
Kevin

Voir aussi ma réponse sur nullet Noneen python ici .
Michael Ekoka

Réponses:


632

Alors, comment puis-je remettre en question une variable qui est un NoneType?

Utilisez l' isopérateur, comme ceci

if variable is None:

Pourquoi ça marche?

Puisque Nonec'est le seul objet singleton de NoneTypePython, nous pouvons utiliser l' isopérateur pour vérifier si une variable s'y trouve Noneou non.

Citant des isdocuments ,

Les opérateurs iset is nottestent l'identité de l'objet: x is yest vrai si et seulement si xet ysont le même objet. x is not ydonne la valeur de vérité inverse.

Puisqu'il ne peut y avoir qu'une seule instance de None, isserait la meilleure façon de vérifier None.


Écoutez-le de la bouche du cheval

Citant les directives de style de codage de Python - PEP-008 (défini conjointement par Guido lui-même),

Les comparaisons avec des singletons comme Nonedevraient toujours être faites avec isouis not , jamais avec les opérateurs d'égalité .


Alors, quelle est la différence entre == Noneet is None?
NoName

@NoName En ce qui concerne None, ils donneront tous deux un résultat similaire.
thefourtheye

2
cela ne fonctionne pas si l'on compare si un pandasDataFrame existe - pour cela, j'utilise type(df) is type(None)pour éviter:The truth value of a DataFrame is ambiguous
Marc Maxmeister


27

Cela peut également être fait avec isinstanceselon la réponse d'Alex Hall :

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance est aussi intuitif mais il y a la complication qu'il nécessite la ligne

NoneType = type(None)

qui n'est pas nécessaire pour les types comme intet float.


Puisque vous ne pouvez pas sous NoneType- classer et puisqu'il Nones'agit d'un singleton, isinstancene doit pas être utilisé pour détecter None- à la place, vous devez faire comme le dit la réponse acceptée, et utiliser is Noneou is not None.
Aaron Hall

18

Comme le souligne le commentaire d'Aaron Hall:

Puisque vous ne pouvez pas sous NoneType- classer et puisqu'il Nones'agit d'un singleton, isinstancene doit pas être utilisé pour détecter None- à la place, vous devez faire comme le dit la réponse acceptée, et utiliser is Noneou is not None.


Réponse originale:

Le moyen le plus simple cependant, sans la ligne supplémentaire en plus de la réponse de la cardamome, est probablement:
isinstance(x, type(None))

Alors, comment puis-je remettre en question une variable qui est un NoneType? Je dois utiliser la méthode if

L'utilisation isinstance()ne nécessite pas de isdans la ifdéclaration:

if isinstance(x, type(None)): 
    #do stuff

Informations supplémentaires
Vous pouvez également rechercher plusieurs types dans une seule isinstance()instruction, comme indiqué dans la documentation . Écrivez simplement les types sous forme de tuple.

isinstance(x, (type(None), bytes))

1
Puisque vous ne pouvez pas sous NoneType- classer et puisqu'il Nones'agit d'un singleton, isinstancene doit pas être utilisé pour détecter None- à la place, vous devez faire comme le dit la réponse acceptée, et utiliser is Noneou is not None.
Aaron Hall

1
Cette réponse a été utile pourpython 3.6.7
Santhosh Dhaipule Chandrakanth

@AaronHall Pourquoi isinstance ne pas utiliser? Je comprends que cela isdevrait être préféré, mais il y a des cas où la forme isinstance semble plus naturelle (comme vérifier plusieurs types à la fois isinstance(x, (str, bool, int, type(None)))). Est-ce simplement une préférence personnelle ou y a-t-il une mise en garde que je ne connais pas?
Conchylicultor

@Conchylicultor inconvénients de votre suggestion: 1. recherche globale pour type2. puis appelez-la 3. puis recherchez le type de None- quand Noneest à la fois un singleton et un mot-clé. Un autre inconvénient: 4. ceci est très non standard et soulèvera les sourcils lorsque les gens regarderont votre code. x is Noneest une vérification plus optimisée. Je suggérerais x is None or isinstance(x, (str, bool, int))- mais je suggérerais également que vous réfléchissiez davantage à ce que vous faites quand vous faites ce genre de vérification de type pour les types qui n'ont pas beaucoup en commun ...
Aaron Hall

4

Je ne sais pas si cela répond à la question. Mais je sais que cela m'a pris du temps à comprendre. Je parcourais un site Web et tout à coup, le nom des auteurs n'était plus là. Il fallait donc une déclaration de vérification.

if type(author) == type(None):
     my if body
else:
    my else body

L'auteur peut être n'importe quelle variable dans ce cas, et Nonepeut être n'importe quel type que vous recherchez.


Puisque Noneest un singleton, typene doit pas être utilisé pour détecter None- à la place, vous devez faire comme le dit la réponse acceptée, et utiliser is Noneou is not None.
Aaron Hall

2

Python 2.7:

x = None
isinstance(x, type(None))

ou

isinstance(None, type(None))

==> Vrai


1
Puisque vous ne pouvez pas sous NoneType- classer et puisqu'il Nones'agit d'un singleton, isinstancene doit pas être utilisé pour détecter None- à la place, vous devez faire comme le dit la réponse acceptée, et utiliser is Noneou is not None.
Aaron Hall

Ah d'accord! Merci !
Pesko

0

J'espère que cet exemple vous sera utile)

print(type(None) # NoneType

Vous pouvez donc vérifier le type du nom de variable

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.