2012-05-03 32 views
5

Đây là một câu hỏi phỏng vấn đã được hỏi cho tôi. Xin vui lòng không phạt tôi nếu nó không có ý nghĩa. Cô ấy hỏi:cách thay đổi chức năng trong thư viện của bên thứ 3 hiện có trong python

"Tôi có một lib bên thứ 3 hiện có trong python và có hàm foo() trong đó. Làm cách nào để sửa đổi chức năng đó sau khi nhập vào mô-đun hiện tại của tôi?"

+0

Tắt đầu của tôi, sử dụng chức năng trình bao bọc. –

Trả lời

2

Điều này được gọi là vá khỉ. Tóm lại, bạn chỉ có thể gán cho biến giữ chức năng:

import existingmodule 

existingmodule.foo = lambda *args, **kwargs: "You fail it" 

Đây hiếm khi là câu trả lời đúng trong thực tế. Tốt hơn là bạn nên bọc một cái gì đó với chức năng của riêng bạn, hoặc cung cấp việc thực hiện của riêng bạn ở nơi khác, hoặc sử dụng thừa kế (nếu một phương thức trên một lớp).

Lý do duy nhất để làm điều này là nếu bạn cần các hành vi thay đổi được phản ánh trong mã riêng của thư viện (hoặc mã của bên thứ ba khác); nếu có, hãy kiểm tra tốt. Nó thường là một cách tiếp cận tốt hơn là chỉ tạo ra ngã ba của riêng bạn; nói rằng, bạn nên gửi mã của mình dưới dạng bản vá, vì vậy không chỉ bạn hỗ trợ mã đó nếu dự án được chấp nhận.

1

Phương pháp phổ biến nhất sẽ là Monkey patching (Xem: stackoverflow: what is monkey patching)

Ví dụ:

>>> import os 
>>> os.listdir('.') 
['file_a', 'file_b'] 
>>> os.listdir = lambda folder: ['nothing in here, nope!'] 
>>> os.listdir('.') 
['nothing in here, nope!'] 

Có một rất tốt talk về đề tài này tại PyCon 2012 mà bạn có thể xem trên youtube

Buổi nói chuyện cũng đưa ra một ví dụ rất tốt về nơi khỉ vá có thể hữu ích: Giả sử bạn có một thư viện của bên thứ ba mà không một điều nào đó. Để thực hiện hành động này, tập lệnh này yêu cầu phải chạy dưới dạng root - nhưng chức năng thực tế không yêu cầu quyền root. Bây giờ thư viện của bên thứ ba có thể đang kiểm tra điều này với os.geteuid() == 0. Bằng cách vá khỉ trong mã của bạn sử dụng thư viện này, bạn có thể ghi đè geteuid vào thư mục gốc giả để giải quyết hạn chế này.

Sử dụng khỉ vá là một cách tuyệt vời để làm một sửa chữa nhanh chóng để thư viện. Nộp một báo cáo lỗi và chờ đợi một bản vá có thể mất một lúc, vì vậy bạn có thể tự giúp mình theo cách này, mà không cần đào sâu vào mã nguồn của thư viện.

+1

Nó không phải là "một cách tuyệt vời" để làm bất cứ điều gì. Đôi khi nó là cách duy nhất hoặc ít phức tạp nhất để làm điều gì đó. – Marcin

Các vấn đề liên quan