पाठ 16 / 25

सूक्ष्म Logic Bugs

बनाए कोड में off-by-one errors, छूटे edge cases और साझा state की ग़लतियाँ पकड़ें।

आकार सही, ब्योरा ग़लत

बनाए कोड का ढाँचा अक्सर सही होता है पर कोई ब्योरा ग़लत: off-by-one error, खाली list की जाँच का छूटना, सीमा जो समावेशी होनी चाहिए, साझा mutable default। ये सरसरी नज़र में निकल जाते हैं। कोड को सीमा के inputs (0, 1, खाली, अधिकतम) पर चलाएँ और loops व indexes धीरे पढ़ें।

दो पुरानी चूकें, चलाकर

मैंने यह चलाया। average([]) ZeroDivisionError उठाता है। page_bad page 1 को दूसरा पन्ना मानता है, इसलिए पहले तीन items छोड़ देता है; page_ok 1 से शुरू होने वाले pages उपयोग करता है।

def average(nums):
    return sum(nums) / len(nums)        # crashes on []
def average_safe(nums):
    return sum(nums) / len(nums) if nums else 0.0

items = list(range(1, 11))
def page_bad(items, page, size):
    return items[page * size : page * size + size]     # 0-based by accident
def page_ok(items, page, size):
    start = (page - 1) * size
    return items[start : start + size]

print(average_safe([]), average_safe([2, 4]))
print(page_bad(items, 1, 3), page_ok(items, 1, 3))

Output:

0.0 3.0
[4, 5, 6] [1, 2, 3]

शून्य, एक और कई मामले आज़माएँ

ज़्यादातर bugs सीमाओं पर छिपते हैं। किसी भी function पर भरोसा करने से पहले उसे बिना कुछ, ठीक एक item और कई items के साथ परखें।

त्वरित जाँच: `average(nums)` में छूटी जाँच वाले bug को कौन-सा input सबसे ज़्यादा उजागर करेगा?

  • 1000 संख्याओं की list
  • सिर्फ़ strings की list
  • खाली list
  • बहुत लंबा variable नाम
Answer

खाली list — खाली input पुराना सीमा-मामला है जो शून्य से भाग उठाता है।