2011-07-05 27 views
69

Tôi đã mã hóa rất nhiều trong Python về muộn. Và tôi đã làm việc với dữ liệu mà tôi chưa từng làm trước đây, sử dụng các công thức chưa từng thấy trước đây và xử lý các tệp lớn. Tất cả điều này khiến tôi viết rất nhiều bản in để xác minh xem nó có đúng hay không và xác định các điểm thất bại. Nhưng, nói chung, xuất ra rất nhiều thông tin không phải là một thực hành tốt. Làm cách nào để sử dụng các câu lệnh in khi tôi muốn gỡ lỗi và để chúng bị bỏ qua khi tôi không muốn chúng được in?Chỉ sử dụng lệnh in để gỡ lỗi

Trả lời

102

Mô-đun logging có mọi thứ bạn có thể muốn. Nó có thể có vẻ quá nhiều lúc đầu, nhưng chỉ sử dụng các bộ phận bạn cần. Tôi khuyên bạn nên sử dụng logging.basicConfig để chuyển đổi mức ghi nhật ký thành stderrsimple log methods, debug, info, warning, errorcritical.

import logging, sys 
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) 
logging.debug('A debug message!') 
logging.info('We processed %d records', len(processed_records)) 
16

Sử dụng mô-đun thư viện tích hợp sẵn thay vì in.

Bạn tạo một đối tượng Logger (nói logger), và sau đó sau đó, bất cứ khi nào bạn chèn một bản in debug, bạn chỉ cần đặt:

logger.debug("Some string") 

Bạn có thể sử dụng logger.setLevel vào lúc bắt đầu của chương trình để thiết lập trình độ đầu ra. Nếu bạn đặt nó thành DEBUG, nó sẽ in tất cả các lỗi. Đặt nó thành INFO hoặc cao hơn và ngay lập tức tất cả các lỗi sẽ biến mất.

Bạn cũng có thể sử dụng nó để ghi lại những điều nghiêm trọng hơn, ở các cấp độ khác nhau (INFO, CẢNH BÁO và L ERI).

18

Một cách đơn giản để làm điều này là để gọi một chức năng logging:

DEBUG = True 

def log(s): 
    if DEBUG: 
     print s 

log("hello world") 

Sau đó, bạn có thể thay đổi giá trị của DEBUG và chạy mã của bạn có hoặc không có khai thác gỗ.

Mô-đun chuẩn logging có cơ chế phức tạp hơn cho việc này.

+3

Có lẽ tốt hơn trong thời gian dài để sử dụng mô đun [logging] (http://docs.python.org/library/logging.html) được cung cấp hơn cuộn của riêng bạn (mặc dù nó trông phức tạp hơn). – mgiuca

+7

Đúng, nhưng thật đáng giá để hiểu cách một * có thể tự cuộn. –

+0

Thật vậy. Ở trên là một ý tưởng tốt về cách thức hoạt động của 'logging' (ở mức rất đơn giản). – mgiuca

5

Tôi không biết gì về người khác, nhưng tôi đã được sử dụng để xác định một "hằng số toàn cầu" (DEBUG) và sau đó là một chức năng toàn cầu (debug(msg)) mà sẽ in msg chỉ khi DEBUG == True.

Sau đó, tôi viết các câu lệnh debug của tôi như:

debug('My value: %d' % value) 

... sau đó tôi nhận kiểm tra đơn vị và không bao giờ làm điều này một lần nữa! :)

+0

Thử nghiệm đơn vị ha. Được rồi, đó là một điều khác để được chọn sau đó: ( – crazyaboutliv

+1

Tôi không muốn khuyến khích kiểm thử đơn vị - đó là điều cần thiết. Nhưng tôi không nghĩ rằng đó là một thay thế cho việc đăng nhập, thậm chí là một kỹ thuật gỡ lỗi. – mgiuca

+0

@crazyaboutliv - Kiểm tra đơn vị được thực hiện đúng cách là rất tốt. Hãy xem [chương này] (http://diveintopython.org/unit_testing/index.html) để lặn vào python cho một sự linh hoạt, ngắn gọn, dễ làm theo bài thuyết trình – mac

5

Trước hết, tôi sẽ đứng thứ hai đề cử khuôn khổ logging của python. Hãy cẩn thận một chút về cách bạn sử dụng nó, tuy nhiên. Cụ thể: hãy để khung khai thác gỗ mở rộng các biến của bạn, không tự làm. Ví dụ, thay vì:

logging.debug("datastructure: %r" % complex_dict_structure) 

chắc chắn rằng bạn làm:

logging.debug("datastructure: %r", complex_dict_structure) 

vì trong khi họ nhìn tương tự, phiên bản đầu tiên phải gánh chịu repr() có giá ngay cả khi nó tàn tật.Phiên bản thứ hai tránh điều này. Tương tự, nếu bạn cuộn của riêng bạn, tôi muốn đề nghị một cái gì đó như:

def debug_stdout(sfunc): 
    print(sfunc()) 

debug = debug_stdout 

gọi qua:

debug(lambda: "datastructure: %r" % complex_dict_structure) 

sẽ, một lần nữa, tránh những phí nếu bạn vô hiệu hóa nó bằng cách thực hiện:

def debug_noop(*args, **kwargs): 
    pass 

debug = debug_noop 

Chi phí của việc tính toán các chuỗi đó có thể không quan trọng trừ khi chúng là 1) đắt tiền để tính toán hoặc 2) câu lệnh gỡ rối nằm ở giữa, ví dụ: một vòng lặp n^3 hoặc gì đó. Không phải là tôi sẽ biết gì về điều đó.

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