câu trả lời Blckknght là tuyệt vời nếu bạn muốn làm việc kiểm tra mỗi khi bạn gọi hàm, nhưng nếu bạn có một thiết lập mà bạn có thể đọc một lần và không bao giờ thay đổi, bạn có thể không muốn kiểm tra cài đặt mỗi khi chức năng trang trí được gọi. Trong một số trình nền tảng hiệu suất cao của chúng tôi tại nơi làm việc, tôi đã viết một trình trang trí kiểm tra tệp cài đặt một lần khi tệp python được tải lần đầu tiên và quyết định xem nó có nên bọc nó hay không.
Đây là một mẫu
def timed(f):
def wrapper(*args, **kwargs):
start = datetime.datetime.utcnow()
return_value = f(*args, **kwargs)
end = datetime.datetime.utcnow()
duration = end - start
log_function_call(module=f.__module__, function=f.__name__, start=__start__, end=__end__, duration=duration.total_seconds())
if config.get('RUN_TIMED_FUNCTIONS'):
return wrapper
return f
Giả sử log_function_call mà các bản ghi cuộc gọi của bạn đến một cơ sở dữ liệu, logfile, hoặc bất cứ điều gì và config.get đó ('RUN_TIMED_FUNCTIONS') kiểm tra cấu hình toàn cầu của bạn, sau đó thêm các trang trí @timed với một hàm sẽ kiểm tra một lần khi tải để xem liệu bạn có đang định thời gian trên máy chủ, môi trường, v.v. và nếu không thì nó sẽ không thay đổi việc thực thi hàm trên sản xuất hoặc các môi trường khác mà bạn quan tâm đến hiệu năng.
Cảm ơn! Phần bình luận không định dạng, vì vậy tôi đã thêm mã mẫu vào thư trả lời gốc của bạn. Bạn có thể giải thích tại sao hàm thời gian không được gọi? – cfpete
Trình trang trí được áp dụng tại thời điểm nhập, vì vậy các biến mẫu không được tư vấn tại thời điểm đó. Bạn sẽ phải viết một người trang trí khác cho điều đó, một người tự kiểm tra khi được gọi. Ngoài phạm vi cho định dạng Q và nhận xét này. :-) –
Làm cách nào để sử dụng nó nếu tôi muốn sử dụng phương pháp này dựa trên lớp học, tức là các chế độ xem dựa trên Lớp Django. Ở đó chúng ta phải sử dụng 'method_decorator'. Làm thế nào để làm cho mã này tương thích với điều đó? – PythonEnthusiast