קורס Python שיעור תרגול חריגים (Exceptions)


זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/python/lessons/exception-lab
"""
Answer 33-1
"""

import math
import sys

while True:
    num=sys.stdin.readline()
    if num == '': break

    try:
        num=float(num)
        res=math.sqrt(num)
        print "sqrt: %d" % (res)
    except ValueError as e:
        print "Try again , the value is not math"

איזה מוזר ששמתי ערך 10 החזיר לי 3 ? וגם כאשר שמתי 10.0 ? יש משהו דפוק בפונקציה הזו 
"""
Answer 33-2
"""

import sys
import os

def get_count_lines_for_file(path):
    try:
        with open(path,'r') as f:
            return len([line for line in f])
    except IOError as e:
        print "The file '%s' not exists" % (path)


[_,path]=sys.argv

print get_count_lines_for_file(path)

משום מה תמיד מצליח - למרות ששניתי את הערכים בבדיקות - מוזר מה לא תקין פה 
"""
Answer 33-3
"""

import unittest

class InvalidImageExt(Exception):pass

class ImageFile(object):
    def __init__(self,file):
        if file[-4:] != ".png":raise InvalidImageExt
        self.file=file


class TestImageFile(unittest.TestCase):
    def test_good_ext(self):
        try:
            img = ImageFile("file.png")
        except InvalidImageExt:
            self.fail("png should be a valid file extension")

    def test_bad_ext(self):
        with self.assertRaises(InvalidImageExt):
            img = ImageFile("file.mp3")

unittest.main()

לא הבנתי מה הבעיה? הפונקציה מחזירה את השורה האמיתי אבל אתה מוחק ממנו את כל מה שאחרי הנקודה ובגלל זה מקבל 3

ולגבי הפיתרון השני - הוא לא תמיד מצליח. הנה למשל החלפתי את שם הקובץ בבדיקה להסתיים ב txt ואז הבדיקה נכשלה:

import unittest

class InvalidImageExt(Exception):pass

class ImageFile(object):
    def __init__(self,file):
        if file[-4:] != ".png":raise InvalidImageExt
        self.file=file


class TestImageFile(unittest.TestCase):
    def test_good_ext(self):
        try:
            img = ImageFile("file.txt")
        except InvalidImageExt:
            self.fail("png should be a valid file extension")

    def test_bad_ext(self):
        with self.assertRaises(InvalidImageExt):
            img = ImageFile("file.mp3")

unittest.main()

והתוצאה:

.F
======================================================================
FAIL: test_good_ext (__main__.TestImageFile)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "a.py", line 16, in test_good_ext
    self.fail("png should be a valid file extension")
AssertionError: png should be a valid file extension

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=1)

לא הבנתי - איפה אני מוחק

מוזר זה מה שגם עשיתי והראה לי שהצליח

ניסית להריץ את התוכנית שאני פירסמתי וקיבלת תוצאה שונה ממני?

כן - לקחתי את הקוד שלך - וזה מראה לי שמצליח

נשמע ממש מוזר. אתה מריץ דרך שורת הפקודה או בדרך אחרת? יכול להדביק כאן את התוכנית המדויקת שאתה מריץ ואת הפלט שאתה מקבל?