Ik heb een NoneType
waarde x
, het is over het algemeen een getal, maar het kan ook None
zijn. Ik wil het delen door een getal, maar Python verhoogt:
TypeError: int() argument must be a string or a number, not 'NoneType'
Hoe kan ik dit oplossen?
Antwoord 1, autoriteit 100%
int(value or 0)
Dit gebruikt 0 in het geval dat u een waarde opgeeft die Python als False
beschouwt, zoals Geen, 0, [], “”, enz. Aangezien 0 False
, moet u alleen 0 als alternatieve waarde gebruiken (anders zult u merken dat uw nullen in die waarde veranderen).
int(0 if value is None else value)
Dit vervangt alleen None
door 0. Aangezien we specifiek op None
testen, kunt u een andere waarde gebruiken als vervanging.
Antwoord 2, autoriteit 15%
In een van de reacties zeg je:
Op de een of andere manier kreeg ik een Nonetype-waarde, het zou een int moeten zijn, maar het is nu een Nonetype-object
Als het jouw code is, zoek dan uit hoe je None
krijgt als je een nummer verwacht en voorkom dat datgebeurt.
Als het de code van iemand anders is, zoek dan uit onder welke voorwaarden het None
geeft en bepaal een verstandige waarde om daarvoor te gebruiken, met de gebruikelijke voorwaardelijke code:
result = could_return_none(x)
if result is None:
result = DEFAULT_VALUE
…of zelfs…
if x == THING_THAT_RESULTS_IN_NONE:
result = DEFAULT_VALUE
else:
result = could_return_none(x) # But it won't return None, because we've restricted the domain.
Er is geen reden om hier automatisch 0
te gebruiken — oplossingen die afhankelijk zijn van de “false”-heid van None
gaan ervan uit dat u dit wilt. De DEFAULT_VALUE
(als deze al bestaat) hangt volledig af van het doel van je code.
Antwoord 3, autoriteit 5%
Een veelgebruikte “pythonische” manier om met dit soort situaties om te gaan, staat bekend als EAFPvoor “Het is gemakkelijker om vergeving te vragen dan om toestemming“. Wat meestal betekent dat je code moet schrijven die ervan uitgaat dat alles in orde is, maar deze vervolgens omwikkelt met een try...except
-blok om dingen af te handelen – voor het geval dat – dat niet het geval is.
Hier is die codeerstijl toegepast op uw probleem:
try:
my_value = int(my_value)
except TypeError:
my_value = 0 # or whatever you want to do
answer = my_value / divisor
Of misschien nog eenvoudiger en iets sneller:
try:
answer = int(my_value) / divisor
except TypeError:
answer = 0
De omgekeerde en meer traditionele benadering staat bekend als LBYLwat staat voor “Kijk voordat je springt” is wat @Soviut en enkele anderen hebben gesuggereerd. Zie voor meer informatie over dit onderwerp mijn antwoorden de bijbehorende opmerkingen bij de vraag Bepaal of een sleutel aanwezig is in een woordenboekelders op deze site.
Een mogelijk probleem met EAFPis dat het kan verbergen dat er iets mis is met een ander deel van je code of een module van derden die je gebruikt, vooral wanneer de uitzonderingen vaak voorkomen ( en zijn daarom helemaal geen “uitzonderlijke” gevallen).
Antwoord 4, autoriteit 3%
Die TypeError
verschijnt alleen wanneer u int()
None
probeert door te geven (wat het enige NoneType
is waarde voor zover ik weet). Ik zou zeggen dat je echte doel niet zou moeten zijn om NoneType
te converteren naar int
of str
, maar om erachter te komen waar/waarom je None
in plaats van een nummer zoals verwacht, en repareer het of behandel de None
correct.
Antwoord 5, autoriteit 3%
In Python 3 kun je ook het trefwoord “of” gebruiken. Op deze manier:
foo = bar or 0
foo2 = bar or ""
Antwoord 6
Ik heb met succes int(x of 0) gebruikt voor dit type fout, zolang Geen in de logica gelijk zou moeten zijn aan 0.
Merk op dat dit ook in andere gevallen zal worden opgelost naar 0 waarin het testen van x False retourneert. bijv. lege lijst, set, woordenboek of string met lengte nul.
Sorry, Kindall heeft dit antwoord al gegeven.
Antwoord 7
Dit kan gebeuren als u vergeet een waarde van een functie te retourneren: deze retourneert vervolgens Geen. Kijk naar alle plaatsen waar je die variabele toewijst, en kijk of een daarvan een functieaanroep is waarbij de functie geen return-statement heeft.
Antwoord 8
Controleer of de waarde nietGeen is voordat u er berekeningen op uitvoert:
my_value = None
if my_value is not None:
print int(my_value) / 2
Opmerking:my_value
is opzettelijk ingesteld op Geen om te bewijzen dat de code werkt en dat de controle wordt uitgevoerd.
Antwoord 9
Ik had hetzelfde probleem bij het gebruik van de e-mailfuncties van Python.
Hieronder staat de code die ik probeerde op te halen e-mailonderwerp in een variabele. Dit werkt prima voor de meeste e-mails en de variabele wordt ingevuld. Als u een e-mail van Yahoo of iets dergelijks ontvangt en de afzender heeft de onderwerpregel niet ingevuld, maakt Yahoo geen onderwerpregel in de e-mail en krijgt u een GeenType geretourneerd van de functie. Martineau gaf een correct antwoord evenals Soviut. Het antwoord van IMO Soviut is beknopter vanuit een programmeerstandpunt; niet noodzakelijk van een Python-versie.
Hier is wat code om de techniek te laten zien:
import sys, email, email.Utils
afile = open(sys.argv[1], 'r')
m = email.message_from_file(afile)
subject = m["subject"]
# Soviut's Concise test for unset variable.
if subject is None:
subject = "[NO SUBJECT]"
# Alternative way to test for No Subject created in email (Thanks for NoneThing Yahoo!)
try:
if len(subject) == 0:
subject = "[NO SUBJECT]"
except TypeError:
subject = "[NO SUBJECT]"
print subject
afile.close()
Antwoord 10
In sommige situaties is het handig om een functie te hebben om Geen naar int nul te converteren:
def nz(value):
'''
Convert None to int zero else return value.
'''
if value == None:
return 0
return value