Zero jest wartością, a nie brakującym polem
przyjmuje limit powiadomień. Zero oznacza „nie wysyłaj”, a brak pola „użyj wartości domyślnej”. Skrót value or 10 traktuje oba przypadki tak samo i po cichu zamienia zero na dziesięć.
Uruchom mały przykład
Zapisz jako limit.py i uruchom python3 limit.py z Pythonem 3.11 lub nowszym. Bez pakietów i serwera.
def limit(data: dict) -> int:
if "limit" not in data:
return 10
value = data["limit"]
if type(value) is not int or not 0 <= value <= 100:
raise ValueError("limit must be an integer from 0 to 100")
return value
print(limit({}))
print(limit({"limit": 0}))
try:
limit({"limit": None})
except ValueError:
print("invalid")Oczekiwany wynik:
10
0
invalidSprawdzenie klucza mówi, czy klient przesłał pole. Sprawdzenie typu i zakresu mówi, czy wartość spełnia . Jawne None jest tutaj błędem: to świadoma reguła tego API, nie reguła wszystkich aplikacji.
bool jest w podklasą int. Porównanie dokładnego typu celowo odrzuca True: wartość logiczna nie jest w tym kontrakcie liczbą powiadomień. Sama adnotacja typu nie waliduje danych.
Sprawdź kuszący skrót
Zastąp ciało przez return data.get("limit") or 10. Uruchom te same przypadki. Zarówno zero, jak i jawne None stają się dziesięć. Odpowiedź mogłaby nadal oznaczać sukces, mimo błędnej reguły biznesowej.
Przywróć funkcję. Dopisz sprawdzenia dla 100, 101, True i tekstu "2". Przed uruchomieniem podziel je na akceptowane i odrzucane. Nie zamieniaj tekstu na liczbę, jeśli kontrakt API tego nie dopuszcza.
Zastosuj regułę gdzie indziej
Żądanie zmienia profil: brak pseudonimu oznacza „pozostaw”, a null oznacza „wyczyść”. To inny kontrakt. Zapisz oczekiwane wyniki, zanim wybierzesz get, wartość domyślną albo . nie musi odpowiadać biznesowemu znaczeniu braku danych.
Źródła
SPRAWDŹ SWOJĄ INTUICJĘ

