Mam Nonetypewartość x, generalnie jest to liczba, ale może być None. Chcę to podzielić przez liczbę, ale Python podnosi:
TypeError: int() argument must be a string or a number, not 'NoneType'
Jak mogę to rozwiązać?
Mam Nonetypewartość x, generalnie jest to liczba, ale może być None. Chcę to podzielić przez liczbę, ale Python podnosi:
TypeError: int() argument must be a string or a number, not 'NoneType'
Jak mogę to rozwiązać?
int(None)zgłasza wyjątek, ponieważ None nie może zostać przekonwertowana na int. Odpowiedź na Twoje pytanie brzmi: nie da się tego zrobić. Możesz podstawić coś, na przykład 0, 2771 lub różowego słonia, ale cokolwiek zastąpisz, nadal nie będziesz w stanie przekonwertować None na int.
Nonena różowego słonia też nie jest dobra, chyba że pracujesz nad jakimś systemem liczbowym, który formalnie definiuje dzielenie liczby przez różowego słonia (i napisałeś kod, aby ją wykonać)
Odpowiedzi:
W jednym z komentarzy mówisz:
W jakiś sposób otrzymałem wartość Nonetype, przypuszczalnie to int, ale teraz jest to obiekt Nonetype
Jeśli to twój kod, dowiedz się, jak otrzymujesz, Nonekiedy spodziewasz się liczby, i powstrzymaj to .
Jeśli jest to kod kogoś innego, dowiedz się, w jakich warunkach daje Nonei określ sensowną wartość do użycia, używając zwykłego kodu warunkowego:
result = could_return_none(x)
if result is None:
result = DEFAULT_VALUE
...lub nawet...
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.
Nie ma powodu, aby używać 0tutaj automatycznie - rozwiązań, które zależą od „fałszywego” Nonezałożenia, że będziesz tego chciał. DEFAULT_VALUE(Jeśli w ogóle istnieje) całkowicie zależy od celu w kodzie.
int(value or 0)
Spowoduje to użycie 0 w przypadku, gdy podasz jakąkolwiek wartość uznaną przez Pythona False, taką jak Brak, 0, [], "" itd. Ponieważ 0 to False, powinieneś używać tylko 0 jako wartości alternatywnej (w przeciwnym razie znajdziesz swoje 0 zamieniając się w tę wartość).
int(0 if value is None else value)
To zastępuje tylko None0. Ponieważ testujemy Nonekonkretnie, możesz użyć innej wartości jako zamiennika.
(value or 0)- bez rzutowania typu int - jeśli zapewnimy, że wartość może być tylko wartością None lub int
Powszechny „Pythonowy” sposób radzenia sobie z tego rodzaju sytuacjami jest znany jako EAFP, czyli „ łatwiej prosić o przebaczenie niż o pozwolenie ”. Co zwykle oznacza napisanie kodu, który zakłada, że wszystko jest w porządku, ale następnie owinięcie go try...exceptblokiem do obsługi rzeczy - tak na wszelki wypadek - tak nie jest.
Oto styl kodowania zastosowany do Twojego problemu:
try:
my_value = int(my_value)
except TypeError:
my_value = 0 # or whatever you want to do
answer = my_value / divisor
A może jeszcze prostszy i nieco szybszy:
try:
answer = int(my_value) / divisor
except TypeError:
answer = 0
Odwrotne i bardziej tradycyjne podejście jest znane jako LBYL, co oznacza „ Look before you leap ”, co zasugerował @Soviut i niektórzy inni. Aby uzyskać dodatkowe omówienie tego tematu, zobacz moją odpowiedź i powiązane komentarze do pytania Ustal, czy klucz znajduje się w słowniku w innym miejscu na tej stronie.
Jednym z potencjalnych problemów z EAFP jest to, że może on ukryć fakt, że coś jest nie tak z inną częścią twojego kodu lub modułem innej firmy, z której korzystasz, zwłaszcza gdy często występują wyjątki (i dlatego nie są to naprawdę „wyjątkowe” przypadki w ogóle).
Że TypeErrorpojawia się tylko wtedy, gdy próbujesz przekazać int() None(który jest tylko NoneTypewartość, o ile wiem). Powiedziałbym, że Twoim prawdziwym celem nie powinno być przekonwertowanie NoneTypena intlub str, ale Noneustalenie , gdzie / dlaczego otrzymujesz zamiast liczby zgodnie z oczekiwaniami, i albo napraw go, albo Noneodpowiednio obsłuż.
int()liczby zespolonej, takiej jak int(1+2j), również spowoduje TypeErrorpodniesienie a, chociaż trzeba przyznać, że jest to prawdopodobnie bardzo mało prawdopodobne. Niezależnie od tego, myślę, że powiedziałbyś, że bez wątpienia byłaby to ogólnie dobra rada do naśladowania.
Z powodzeniem użyłem int (x lub 0) dla tego typu błędu, o ile None powinien być równy 0 w logice. Zauważ, że rozwiąże to również do 0 w innych przypadkach, gdy testowanie x zwraca False. np. pusta lista, zbiór, słownik lub łańcuch o zerowej długości. Przepraszamy, Kindall już udzielił tej odpowiedzi.
Może się to zdarzyć, jeśli zapomnisz zwrócić wartość z funkcji: zwraca ona wtedy None. Spójrz na wszystkie miejsca, w których przypisujesz tę zmienną, i zobacz, czy jedno z nich jest wywołaniem funkcji, w którym funkcja nie zawiera instrukcji return.
returnzamiast return some_expression.
return Noneinstrukcji
Przed wykonaniem jakichkolwiek obliczeń należy sprawdzić, czy wartość nie jest ustawiona na Brak:
my_value = None
if my_value is not None:
print int(my_value) / 2
Uwaga: my_value celowo ustawiono wartość Brak, aby udowodnić, że kod działa i że sprawdzanie jest wykonywane.
is [not] None)
my_valuebezwarunkowo None; czemu? Nie zastanawiasz się, dlaczego OP uważa, że musi to zrobić, int(my_value)kiedy my_value(jeśli nie Brak) „ogólnie jest liczbą”.
Miałem ten sam problem podczas korzystania z funkcji poczty e-mail w języku Python. Poniżej znajduje się kod, który próbowałem pobrać temat wiadomości e-mail do zmiennej. Działa to dobrze w przypadku większości wiadomości e-mail i zapełniania zmiennej. Jeśli otrzymasz wiadomość e-mail z Yahoo lub podobnego, a nadawca nie wypełnił tematu, Yahoo nie utworzy tematu wiadomości e-mail, a funkcja zwróci wartość NoneType. Martineau udzielił poprawnej odpowiedzi, podobnie jak Soviut. Odpowiedź IMO Soviut jest bardziej zwięzła z punktu widzenia programowania; niekoniecznie z Pythona. Oto kod pokazujący technikę:
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()
W niektórych sytuacjach pomocne jest posiadanie funkcji konwertującej None na int zero:
def nz(value):
'''
Convert None to int zero else return value.
'''
if value == None:
return 0
return value