Hướng dẫn về Mô-đun và Xử Lý Ngoại Lệ trong Python

Mô-đun

Tạo một mô-đun đơn giản:

# mo_dun_fibo.py
# Mô-đun tính dãy Fibonacci

def tinh_fibo_den_n(n):  # In dãy Fibonacci đến n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a + b
    print()

def lay_danh_sach_fibo_den_n(n):  # Trả về danh sách dãy Fibonacci đến n
    danh_sach = []
    a, b = 0, 1
    while a < n:
        danh_sach.append(a)
        a, b = b, a + b
    return danh_sach

Thay đổi thư mục làm việc của trình thông dịch:

>>> import os
>>> os.getcwd()
'/duong/dan/hien/tai'
>>> os.chdir("/duong/dan/moi")

Nạp mô-đun mo_dun_fibo:

>>> import mo_dun_fibo
>>> mo_dun_fibo.tinh_fibo_den_n(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> mo_dun_fibo.lay_danh_sach_fibo_den_n(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> from mo_dun_fibo import tinh_fibo_den_n, lay_danh_sach_fibo_den_n
>>> tinh_fibo_den_n(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
>>> from mo_dun_fibo import *
>>> tinh_fibo_den_n(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
>>> import mo_dun_fibo as mf
>>> mf.tinh_fibo_den_n(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
>>> from mo_dun_fibo import tinh_fibo_den_n as tfn
>>> tfn(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
  • Mô-đun có thể chứa các câu lệnh thực thi, chỉ được chạy khi lần đầu tiên được nhập.
  • Mô-đun có thể nhập các mô-đun khác, sử dụng cú pháp tên_mô_đun.tên_hàm.
  • Có thể nhập các hàm từ mô-đun khác vào mô-đun hiện tại.
  • Khi sử dụng dấu sao (*), tên mô-đun không được nhập, cũng như các tên bắt đầu bằng dấu gạch dưới (_).
  • Có thể đổi tên mô-đun hoặc tên hàm khi nhập.

Tải lại mô-đun đã nhập:

>>> import mo_dung_bar
>>> import importlib
>>> importlib.reload(mo_dung_bar)

Mô-đun Chuẩn

>>> import mo_dun_fibo, sys
>>> dir(mo_dun_fibo)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'tinh_fibo_den_n', 'lay_danh_sach_fibo_den_n']
>>> ds_so = [1, 2, 3, 4, 5]
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'ds_so', 'mo_dung_bar', 'mo_dun_fibo', 'os', 'sys']

Xử Lý Ngoại Lệ

Sử dụng try ... except để xử lý ngoại lệ:

>>> while True:
    try:
        x = int(input("Nhập một số: "))
        break
    except ValueError:
        print("Không phải là số hợp lệ. Hãy thử lại...")

Nhập một số: a
Không phải là số hợp lệ. Hãy thử lại...
Nhập một số: 3

Kế thừa của lớp ngoại lệ:

>>> class LoaiB(Exception):
    pass

>>> class LoaiC(LoaiB):
    pass

>>> class LoaiD(LoaiC):
    pass

>>> for loai in [LoaiB, LoaiC, LoaiD]:
    try:
        raise loai()
    except LoaiD:
        print("LoaiD")
    except LoaiC:
        print("LoaiC")
    except LoaiB:
        print("LoaiB")

LoaiB
LoaiC
LoaiD

Thông tin kèm theo ngoại lệ:

>>> try:
    raise Exception('spam', 'eggs')
except Exception as thong_tin:
    print(type(thong_tin))    # loại ngoại lệ
    print(thong_tin.args)     # thông số lưu trữ trong .args
    print(thong_tin)          # __str__ cho phép in trực tiếp thông số,
                              # nhưng có thể bị ghi đè trong các lớp con của ngoại lệ
    x, y = thong_tin.args     # giải nén thông số
    print('x =', x)
    print('y =', y)

<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

Sử dụng elsefinally:

>>> def chia_so(x, y):
    try:
        ket_qua = x / y
    except ZeroDivisionError:
        print("Chia cho không!")
    else:
        print("Kết quả là", ket_qua)
    finally:
        print("Đang thực thi khối finally")

>>> chia_so(2, 1)
Kết quả là 2.0
Đang thực thi khối finally
>>> chia_so(2, 0)
Chia cho không!
Đang thực thi khối finally
>>> chia_so("2", "1")
Đang thực thi khối finally
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in chia_so
TypeError: unsupported operand type(s) for /: 'str' and 'str'

Thẻ: python modules exceptions import reload

Đăng vào ngày 26 tháng 6 lúc 16:44