Thông điệp PyLint: nội suy định dạng ghi nhật ký


161

Đối với mã sau:

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

pylint đưa ra cảnh báo sau:

đăng nhập định dạng-định dạng (W1202):

Sử dụng định dạng% trong các chức năng ghi nhật ký và truyền các tham số% làm đối số Được sử dụng khi câu lệnh ghi nhật ký có dạng cuộc gọi ghi nhật ký. (Format_opes.format (format_args ...)). Các cuộc gọi như vậy nên sử dụng định dạng% thay vào đó, nhưng để 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 nó. Tôi giả sử sử dụng format()là cách ưa thích để in ra các câu lệnh trong Python 3. Tại sao điều này không đúng với các câu lệnh logger?

Câu trả lời:


203

Điều này không đúng với câu lệnh logger vì nó dựa vào định dạng "%" trước đây như chuỗi để cung cấp phép nội suy lười biếng của chuỗi này bằng cách sử dụng các đối số bổ sung cho lệnh gọi logger. Ví dụ thay vì làm:

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

bạn nên làm

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

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

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


Theo phần Tối ưu hóa của loggingtài liệu:

Định dạng của các đối số tin nhắn được hoãn lại cho đến khi nó không thể tránh được. Tuy nhiên, 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 làm điều đó nếu trình ghi nhật ký sẽ bỏ đi sự kiện của bạn.


4
@pfnuesel, .format () được mở rộng trước khi cuộc gọi đến logger.error, trong khi "suy lười biếng" có nghĩa là mở rộng được thực hiện chỉ khi cần thiết (ví dụ như tin nhắn được thực hiện ở đâu đó)
sthenault

10
Có một tài liệu tham khảo tốt cho đánh giá lười biếng này được ưa thích và tạo sự khác biệt? Tôi không thể tìm thấy một trong PEP282 hoặc thư viện đăng nhập
thúc vào

25
Nhưng điều này chỉ có nghĩa là chúng ta sẽ gặp vấn đề về bảo trì với mã của chúng ta sau này? Sau này chúng ta sẽ được "đề nghị" bởi pylint để chuyển sang .format()phong cách tại một số điểm vì loggingđã nâng cấp? Tôi hỏi bởi vì tôi quan tâm đến khả năng bảo trì hơn là hiệu suất tốc độ vượt trội, ít nhất là đối với hầu hết các nhiệm vụ.
Mike Williamson

3
@MikeWilliamson: Tôi nghĩ rằng thông báo này là một cảnh báo vì có thể có tác dụng phụ, nhưng bạn có thể bỏ qua nó một cách an toàn.
saihtamtellim

5
Mặc dù phần lớn động lực đằng sau cảnh báo là xung quanh hiệu suất (ví dụ: nếu không phát ra một câu lệnh log, thì chi phí nội suy được lưu lại), đáng chú ý là trong nhiều ứng dụng (có thể nói là hầu hết), chi phí hiệu năng là không đáng kể. Xem: github.com/PyCQA/pylint/issues/2395github.com/PyCQA/pylint/issues/2354
Adam Parkin

23

Có lẽ sự khác biệt thời gian này có thể giúp bạn.

Mô tả sau đây không phải là câu trả lời cho câu hỏi của bạn, nhưng nó có thể giúp mọi người.

Đối với pylint 2.4: Có 3 lựa chọn để đăng nhập phong cách trong .pylintrcfile: old, new,fstr

fstrtùy chọn được thêm vào 2.4 và loại bỏ trong 2.5

Mô tả từ .pylintrctệp (v2.4):

[LOGGING]

# Format style used to check logging format string. `old` means using %
# formatting, `new` is for `{}` formatting,and `fstr` is for f-strings.
logging-format-style=old

cho ( logging-format-style=old):

foo = "bar"
self.logger.info("foo: %s", foo)

cho mới ( logging-format-style=new):

foo = "bar"
self.logger.info("foo: {}", foo)
# OR
self.logger.info("foo: {foo}", foo=foo)

Lưu ý : bạn không thể sử dụng .format()ngay cả khi bạn chọn newtùy chọn.

pylint vẫn đưa ra cảnh báo tương tự cho mã này:

self.logger.info("foo: {}".format(foo))  # W1202
# OR
self.logger.info("foo: {foo}".format(foo=foo))  # W1202

cho fstr ( logging-format-style=fstr):

foo = "bar"
self.logger.info(f"foo: {foo}")

Cá nhân, tôi thích tùy chọn fstr vì PEP-0498 .


2
bạn có thể thêm "python.linting.pylintArgs": ["--logging-format-style=old"]vào tệp vscode / settings.json. tài liệu
mustafagok

2
trong pylint 2.3.1: optparse.OptionValueError: option logging-format-style: invalid value: 'fstr', should be in ['old', 'new']nâng cấp lên pylint mới nhất (2.4.4) đã sửa lỗi này.
Florian Castellane

Tôi đang gặp lỗi sau:Try installing a more recent version of python-pylint, and please open a bug report if the issue persists in t\ he latest release. Thanks!
alper

3

Theo kinh nghiệm của tôi, một lý do hấp dẫn hơn là tối ưu hóa (đối với hầu hết các trường hợp sử dụng) cho phép nội suy lười biếng là nó chơi độc đáo với các trình tổng hợp nhật ký như Sentry.

Hãy xem xét một thông điệp tường trình 'người dùng đăng nhập'. Nếu bạn nội suy người dùng thành chuỗi định dạng, bạn có nhiều thông điệp tường trình riêng biệt như có người dùng. Nếu bạn sử dụng phép nội suy lười biếng như thế này, trình tổng hợp nhật ký có thể diễn giải hợp lý hơn đây là cùng một thông điệp tường trình với một loạt các trường hợp khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.