J'ai une Nonetype
valeur x
, c'est généralement un nombre, mais ça pourrait l'être None
. Je veux le diviser par un nombre, mais Python soulève:
TypeError: int() argument must be a string or a number, not 'NoneType'
Comment puis-je resoudre ceci?
int(None)
lève une exception car None ne peut pas être converti en int. La réponse à votre question est que cela ne peut pas être fait. Vous pouvez remplacer quelque chose, comme 0 ou 2771, ou un éléphant rose, mais quoi que vous remplaciez, vous ne pourrez toujours pas convertir None en int.None
en éléphant rose n'est pas bon non plus, à moins que vous ne travailliez sur un système de numération qui définit formellement la division d'un nombre par un éléphant rose (et que vous avez écrit le code pour le sauvegarder)Réponses:
Dans l'un des commentaires, vous dites:
Si c'est votre code, déterminez comment vous obtenez
None
lorsque vous attendez un numéro et empêchez cela de se produire.Si c'est le code de quelqu'un d'autre, découvrez les conditions dans lesquelles il donne
None
et déterminez une valeur sensible à utiliser pour cela, avec le code conditionnel habituel:...ou même...
Il n'y a aucune raison d'utiliser automatiquement
0
ici - des solutions qui dépendent de la "fausse" -ness deNone
supposer que vous voudrez cela. LeDEFAULT_VALUE
(s'il existe même) dépend complètement de l'objectif de votre code.la source
Cela utilisera 0 dans le cas où vous fournissez une valeur que Python considère
False
, telle que None, 0, [], "", etc. Puisque 0 estFalse
, vous ne devriez utiliser que 0 comme valeur alternative (sinon vous trouverez vos 0 devenir cette valeur).Cela remplace uniquement
None
par 0. Puisque nous testonsNone
spécifiquement, vous pouvez utiliser une autre valeur comme remplacement.la source
(value or 0)
- sans le casting de type int - si nous assurons que la valeur ne peut être qu'un None ou un intUne manière «pythonique» courante de gérer ce genre de situation est connue sous le nom d' EAFP pour « Il est plus facile de demander pardon que la permission ». Ce qui signifie généralement écrire du code qui suppose que tout va bien, mais ensuite l'envelopper avec un
try..except
bloc au cas où il faudrait gérer les choses quand ce n'est pas le cas.Voici ce style de codage appliqué à votre problème:
Ou peut-être le plus simple et légèrement plus rapide:
L'approche inverse et plus traditionnelle est connue sous le nom de LBYL qui signifie « Regardez avant de sauter », c'est ce que @Soviut et certains autres ont suggéré. Pour une couverture supplémentaire de ce sujet, consultez ma réponse et les commentaires associés à la question Déterminez si une clé est présente dans un dictionnaire ailleurs sur ce site.
Un problème potentiel avec EAFP est qu'il peut masquer le fait que quelque chose ne va pas avec une autre partie de votre code ou du module tiers que vous utilisez, en particulier lorsque les exceptions se produisent fréquemment (et ne sont donc pas vraiment des cas "exceptionnels" du tout).
la source
Cela
TypeError
n'apparaît que lorsque vous essayez de passerint()
None
(ce qui est la seuleNoneType
valeur, pour autant que je sache). Je dirais que votre véritable objectif ne devrait pas être de convertirNoneType
enint
oustr
, mais de déterminer où / pourquoi vous obtenezNone
au lieu d'un nombre comme prévu, et de le réparer ou de le gérerNone
correctement.la source
int()
un nombre complexe, tel queint(1+2j)
, entraînera également uneTypeError
augmentation de a, bien que cela soit probablement très improbable. Quoi qu'il en soit, je pense que vous dites serait, sans aucun doute, généralement un bon conseil à suivre.Dans Python 3, vous pouvez également utiliser le mot-clé "ou". Par ici:
la source
J'ai utilisé avec succès int (x ou 0) pour ce type d'erreur, tant que None devrait être égal à 0 dans la logique. Notez que cela sera également résolu à 0 dans d'autres cas où le test de x renvoie False. par exemple, liste vide, ensemble, dictionnaire ou chaîne de longueur nulle. Désolé, Kindall a déjà donné cette réponse.
la source
Cela peut arriver si vous oubliez de renvoyer une valeur à partir d'une fonction: il renvoie alors None. Regardez tous les endroits où vous affectez à cette variable et voyez si l'un d'eux est un appel de fonction où la fonction n'a pas d'instruction de retour.
la source
return
place dereturn some_expression
.return None
instructionsVous devez vérifier que la valeur n'est pas None avant d'essayer d'effectuer des calculs dessus:
Remarque: a
my_value
été intentionnellement défini sur Aucun pour prouver que le code fonctionne et que la vérification est en cours.la source
is [not] None
)my_value
inconditionnellement sur Aucun; Pourquoi? Vous ne vous demandez pas pourquoi l'OP pense qu'il doit faireint(my_value)
quandmy_value
est (sinon Aucun) "généralement un nombre".J'avais le même problème en utilisant les fonctions de messagerie python. Vous trouverez ci-dessous le code que j'essayais de récupérer l'objet de l'e-mail dans une variable. Cela fonctionne bien pour la plupart des e-mails et la variable se remplit. Si vous recevez un e-mail de Yahoo ou autre et que l'expéditeur n'a pas rempli la ligne d'objet, Yahoo ne crée pas de ligne d'objet dans l'e-mail et vous obtenez un NoneType renvoyé par la fonction. Martineau a fourni une réponse correcte ainsi que Soviut. La réponse de l'OMI Soviut est plus concise du point de vue de la programmation; pas nécessairement d'un Python. Voici un code pour montrer la technique:
la source
Dans certaines situations, il est utile d'avoir une fonction pour convertir None en int zéro:
la source