2016-01-05 21 views
55

Đối với đoạn mã sau:pylint nhắn: khai thác gỗ-format-suy

logger.debug('message: {}'.format('test')) 

pylint tạo ra cảnh báo sau đây:

khai thác gỗ-format-suy (W1202):

Sử dụng% định dạng trong chức năng ghi nhật ký và chuyển các tham số% thành các đối số Được sử dụng khi câu lệnh ghi nhật ký có dạng cuộc gọi là “logging. (Định dạng_string.format (format_args ...))”. Các cuộc gọi như vậy nên sử dụng định dạng% thay thế, nhưng để lại nội suy cho hàm ghi nhật ký bằng cách chuyển các tham số dưới dạng đối số.

Tôi biết tôi có thể tắt cảnh báo này, nhưng tôi muốn hiểu điều đó. Tôi giả sử sử dụng format() là cách ưa thích để in các câu lệnh trong python3. Tại sao điều này không đúng đối với các câu lệnh logger?

Trả lời

68

Điều này không đúng đối với câu lệnh logger vì nó dựa trên định dạng "%" cũ như chuỗi để cung cấp nội suy lười của chuỗi này bằng cách sử dụng các đối số bổ sung cho cuộc gọi nhật ký. Ví dụ thay vì thực hiện:

logger.error('oops caused by %s' % exc) 

bạn nên làm

logger.error('oops caused by %s', exc) 

nên chuỗi sẽ chỉ được suy nếu thông điệp được thực sự phát ra.

Bạn không thể hưởng lợi từ chức năng này khi sử dụng .format().


mỗi phần Optimization của logging tài liệu:

Formatting các đối số thông điệp được hoãn lại cho đến khi nó không thể tránh khỏi. Tuy nhiên, việc tính toán các đối số được truyền cho phương thức ghi nhật ký cũng có thể tốn kém và bạn có thể muốn tránh thực hiện nó nếu trình ghi nhật ký chỉ vứt bỏ sự kiện của bạn.

+0

Chức năng chính xác mà bạn không thể hưởng lợi là gì? '.format()' có luôn mở rộng không? Đó có phải là "nội suy lười" có nghĩa là, nó chỉ được mở rộng khi được gọi? – pfnuesel

+3

@pfnuesel, .format() được mở rộng trước cuộc gọi đến logger.error, trong khi "nội suy lười" có nghĩa là mở rộng chỉ được thực hiện nếu cần (ví dụ: thông điệp được hiển thị ở đâu đó) – sthenault

+6

Có một tham chiếu tốt cho việc đánh giá lười biếng này không ưa thích và tạo sự khác biệt? Tôi không thể tìm thấy một trong [PEP282] (https://www.python.org/dev/peps/pep-0282/) hoặc [thư viện ghi nhật ký] (https://docs.python.org/2/library /logging.html) – culix