Comment faire référence à l'objet null en Python?
1194
En Python, l'objet 'null' est le singleton None
.
La meilleure façon de vérifier les choses pour « Noneness » est d'utiliser l'opérateur d'identité, is
:
if foo is None:
...
egg is None
suregg == None
: Ce dernier peut être surchargée, et est susceptible de se briser lorsque l'on compare objet valide avec aucun (dépend de la façon dont il est mis en œuvre, mais vous ne vous attendez pas à tout le monde de prendre comparisions avec aucun compte, pensez - vous?) , toutis
en fonctionnant toujours de la même manière.None
, Null de Python?Il n'y a pas
null
en Python, au lieu de celaNone
. Comme indiqué précédemment, la manière la plus précise de tester que quelque chose a été donné enNone
tant que valeur est d'utiliser l'is
opérateur d'identité, qui teste que deux variables se réfèrent au même objet.Les bases
Il n'y en a et ne peut y en avoir qu'un
None
None
est la seule instance de la classeNoneType
et toute autre tentative d'instanciation de cette classe retournera le même objet, ce qui faitNone
un singleton. Les nouveaux venus sur Python voient souvent des messages d'erreur qui mentionnentNoneType
et se demandent ce que c'est. C'est mon opinion personnelle que ces messages pourraient simplement mentionner leurNone
nom parce que, comme nous le verrons bientôt,None
laisse peu de place à l'ambiguïté. Donc, si vous voyez unTypeError
message qui mentionne queNoneType
vous ne pouvez pas faire ceci ou ne pouvez pas faire cela, sachez simplement que c'est simplement celuiNone
qui était utilisé d'une manière qu'il ne peut pas.En outre,
None
est une constante intégrée, dès que vous démarrez Python, elle est disponible pour être utilisée de partout, que ce soit dans un module, une classe ou une fonction.NoneType
en revanche, ce n'est pas le cas, vous devez d'abord obtenir une référence en interrogeantNone
sa classe.Vous pouvez vérifier
None
l'unicité de la fonction d'identité de Pythonid()
. Il renvoie le numéro unique attribué à un objet, chaque objet en a un. Si l'id de deux variables est le même, alors elles pointent en fait vers le même objet.None
ne peut pas être écraséDans une version beaucoup plus ancienne de Python (avant 2.4), il était possible de réaffecter
None
, mais plus maintenant. Pas même en tant qu'attribut de classe ou dans les limites d'une fonction.Il est donc prudent de supposer que toutes les
None
références sont les mêmes. Il n'y a pas de "coutume"None
.Pour tester l'
None
utilisation de l'is
opérateurLors de l'écriture de code, vous pourriez être tenté de tester la non- existence comme ceci:
Ou pour tester le mensonge comme celui-ci
Vous devez comprendre les implications et pourquoi c'est souvent une bonne idée d'être explicite.
Cas 1: tester si une valeur est
None
pourquoi faire ceci
plutôt que
Le premier équivaut à:
Alors que l'expression
value==None
est en fait appliquée comme cecisi la valeur est vraiment,
None
vous obtiendrez ce que vous attendiez.Dans la plupart des cas, le résultat sera le même, mais la
__eq__()
méthode ouvre une porte qui annule toute garantie de précision, car elle peut être remplacée dans une classe pour fournir un comportement spécial.Considérez cette classe.
Donc vous l'essayez
None
et ça marcheMais cela fonctionne aussi sur la chaîne vide
Et pourtant
Cas 2: Utilisation en
None
tant que booléenLes deux tests suivants
sont en fait évalués comme
None
est un "falsey", ce qui signifie que s'il est converti en booléen, il reviendraFalse
et s'il est appliqué à l'not
opérateur, il reviendraTrue
. Notez cependant que ce n'est pas une propriété unique àNone
. En plus d'False
elle-même, la propriété est partagée par des listes vides, des tuples, des ensembles, des dict, des chaînes, ainsi que 0, et tous les objets des classes qui implémentent la__bool__()
méthode magique à renvoyerFalse
.Ainsi, lorsque vous testez des variables de la manière suivante, soyez très conscient de ce que vous incluez ou excluez du test:
Dans ce qui précède, vouliez-vous appeler
init_value()
lorsque la valeur est définie spécifiquement surNone
, ou vouliez-vous qu'une valeur définie sur0
, ou la chaîne vide, ou une liste vide devrait également déclencher l'initialisation. Comme je l'ai dit, soyez conscient. Comme c'est souvent le cas en Python, explicite vaut mieux qu'implicite .None
en pratiqueNone
utilisé comme valeur de signalNone
a un statut spécial en Python. C'est une valeur de référence préférée car de nombreux algorithmes la traitent comme une valeur exceptionnelle. Dans de tels scénarios, il peut être utilisé comme indicateur pour signaler qu'une condition nécessite une gestion particulière (comme la définition d'une valeur par défaut).Vous pouvez attribuer
None
aux mots clés des arguments d'une fonction, puis les tester explicitement.Vous pouvez le renvoyer par défaut lorsque vous essayez d'accéder à l'attribut d'un objet, puis le tester explicitement avant de faire quelque chose de spécial.
Par défaut, la
get()
méthode d' un dictionnaire renvoieNone
lorsque vous essayez d'accéder à une clé non existante:Si vous deviez essayer d'y accéder en utilisant la notation d' un indice
KeyError
se poseraientDe même, si vous essayez de faire apparaître un élément inexistant
que vous pouvez supprimer avec une valeur par défaut qui est généralement définie sur
None
None
utilisé à la fois comme indicateur et comme valeur valideLes utilisations décrites ci-dessus
None
s'appliquent lorsque ce n'est pas considéré comme une valeur valide, mais plutôt comme un signal pour faire quelque chose de spécial. Il y a cependant des situations où il est parfois important de savoir d'oùNone
vient car même s'il est utilisé comme signal, il peut également faire partie des données.Lorsque vous interrogez un objet pour son attribut,
getattr(some_obj, 'attribute_name', None)
le retourNone
ne vous dit pas si l' attribut auquel vous tentiez d'accéder a été définiNone
ou s'il était totalement absent de l'objet. Même situation lors de l'accès à une clé à partir d'un dictionnaire commesome_dict.get('some_key')
, vous ne savez pas si ellesome_dict['some_key']
est manquante ou si elle est juste définie surNone
. Si vous avez besoin de ces informations, la manière habituelle de gérer cela est d'essayer directement d'accéder à l'attribut ou à la clé à partir d'unetry/except
construction:De même avec dict:
Les deux exemples ci-dessus montrent comment gérer les cas d'objets et de dictionnaire, qu'en est-il des fonctions? Même chose, mais nous utilisons à cet effet l'argument du mot-clé double astérisques:
None
utilisé uniquement comme valeur valideSi vous trouvez que votre code est jonché du
try/except
modèle ci-dessus simplement pour différencier lesNone
indicateurs et lesNone
données, utilisez simplement une autre valeur de test. Il existe un modèle dans lequel une valeur qui ne fait pas partie de l'ensemble de valeurs valides est insérée en tant que partie des données dans une structure de données et est utilisée pour contrôler et tester des conditions spéciales (par exemple, limites, état, etc.). Une telle valeur est appelée sentinelle et elle peut être utilisée de la même manièreNone
qu’un signal. Il est trivial de créer une sentinelle en Python.L'
undefined
objet ci-dessus est unique et ne fait pas grand-chose de ce qui pourrait intéresser un programme, c'est donc un excellent remplacementNone
comme drapeau. Certaines mises en garde s'appliquent, plus à ce sujet après le code.Avec fonction
Avec dict
Avec un objet
Comme je l'ai mentionné plus tôt, les sentinelles personnalisées comportent certaines mises en garde. Tout d'abord, ce ne sont pas des mots-clés
None
, donc python ne les protège pas. Vous pouvez remplacer votreundefined
ci - dessus à tout moment, n'importe où dans le module défini, alors faites attention à la façon dont vous les exposez et les utilisez. Ensuite, l'instance renvoyée parobject()
n'est pas un singleton, si vous effectuez cet appel 10 fois, vous obtenez 10 objets différents. Enfin, l'utilisation d'une sentinelle est hautement idiosyncrasique. Une sentinelle est spécifique à la bibliothèque dans laquelle elle est utilisée et, en tant que telle, sa portée doit généralement être limitée aux éléments internes de la bibliothèque. Il ne devrait pas "fuir". Le code externe ne doit en prendre connaissance que si son but est d'étendre ou de compléter l'API de la bibliothèque.la source
Ce n'est pas appelé null comme dans d'autres langues, mais
None
. Il n'y a toujours qu'une seule instance de cet objet, vous pouvez donc vérifier l'équivalence avecx is None
(comparaison d'identité) au lieu dex == None
, si vous le souhaitez.la source
None
. Ensuite, tous ces gens intelligents qui ont comparé contreNoneType
triompheront!En Python, pour représenter l'absence de valeur, vous pouvez utiliser la valeur None ( types.NoneType.None ) pour les objets et "" (ou len () == 0 ) pour les chaînes. Donc:
En ce qui concerne la différence entre "==" et "is", le test d'identité d'objet à l'aide de "==" devrait être suffisant. Cependant, puisque l'opération "is" est définie comme l'opération d'identité d'objet, il est probablement plus correct de l'utiliser plutôt que "==". Je ne sais pas s'il y a même une différence de vitesse.
Quoi qu'il en soit, vous pouvez consulter:
la source
0 == false
retourtrue
est que l'opérateur double-égal tape la contrainte. Avec l'opérateur triple-égal, cependant,0 === false
renvoiefalse
, car «nombre» et «booléen» sont de types différents.true
dans les conditions. Rust and Go,0
etfalse
sont différents types qui ne peuvent pas être comparés pour l' égalité.Null est un type d'objet spécial comme:
Vous pouvez vérifier si un objet est dans la classe 'NoneType':
Plus d'informations sont disponibles sur Python Docs
la source
Par test de valeur de vérité , «Aucun» teste directement comme FAUX, donc l'expression la plus simple suffira:
la source
True
pour toute valeur falsifiée, pas seulementNone
.