Hướng dẫn python log decorator hackerrank solution - giải pháp hackerrank trang trí nhật ký python

Mọi người đều ổn trong chức năng của bạn. Bạn dường như bị mất với các đối số từ khóa và vị trí và từ khóa.

Hãy để tôi giải thích: Đối số vị trí, a

def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
0 Trong trường hợp của bạn, là bắt buộc (và có thể có các giá trị mặc định). Các đối số khác là tùy chọn. Nếu bạn muốn đưa ra một đối số bắt buộc hoặc có giá trị mặc định, hãy đặt nó trước *args và ** kwargs. Nhưng hãy nhớ rằng bạn không thể cung cấp một đối số hai lần:

def x(a = 1, b = 2, *args, **kwargs):
    print a, b, args, kwargs

>>> x(3, 4, 5, b=6)
TypeError: x() got multiple values for keyword argument 'b'

Có một cách khác, nhưng không thể đọc được, để có các giá trị mặc định cho các đối số và không có đối số vị trí:

def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})

Chức năng của bạn phân tích các đối số là OK, mặc dù tôi không hiểu tại sao bạn viết

def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
1 và
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
2 vào
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
3. Nó vượt qua các đối số một cách trong suốt:

def x(a = 1, b = 2, *args, **kwargs):
    print a, b, args, kwargs

def y(*args, **kwargs):
    x(*args, **kwargs)

>>> y(3, 4, 5, 6)
3 4 (5, 6) {}

>>> y(3, 4, 5, b=6)
TypeError: x() got multiple values for keyword argument 'b'

Thông báo để ghi nhật ký

tiều phu

không

Một đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
operator
người xử lý person_lister(f):
Một đối tượng xử lý nhật ký tùy chỉnh. Chỉ có sẵn nếu không có đối tượng logger được đưa ra. inner(people):
Callable_format_varable map(f, sorted(people, key=lambda x: int(x[2])))
Tên biến người ta có thể sử dụng trong thông báo để tham khảo các cuộc gọi được trang trí có thể gọi được. ví dụ. @log_on_start (lỗi, "được gọi là {callable .__ Tên __: s}", ...) Mặc định: "Callable" inner
@person_listerperson_lister
log_on_end / async_log_on_end name_format(person):
Một đối tượng logger thay thế. Nếu không có logger nào được cung cấp logdecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
('Mr. ' if person[3] == 'M' else 'Ms. ') + person[0] + ' ' + person[1]
if__name __ == '__ main__': __name__ == '__main__':
People = [input (). split () foriinrange (int (input ()))]] = [input().split() for i in range(int(input()))]
in (*name_format (người), sep = '\ n'))(*name_format(people), sep='\n')

Exception_format_varable

Tên biến người ta có thể sử dụng trong thông báo để tham khảo ngoại lệ bị bắt được nêu trong hàm được trang trí> ví dụ: @log_on_error (lỗi, "lỗi là: {e! r}", ...) mặc định: "e"

Callable_format_varable

Tên biến người ta có thể sử dụng trong thông báo để tham khảo các cuộc gọi được trang trí có thể gọi được. ví dụ. @log_on_start (lỗi, "được gọi là {callable .__ Tên __: s}", ...) Mặc định: "Callable"

log_exception / async_log_exception

Tranh luận

Sự mô tả

mức đăng nhập

Vâng

$ pip install logdecorator

Mức nhật ký mà tin nhắn nên được gửi

tl;dr

import logging
import requests
from logdecorator import log_on_start, log_on_end, log_on_error, log_exception


@log_on_start(logging.DEBUG, "Start downloading {url:s}...")
@log_on_error(logging.ERROR, "Error on downloading {url:s}: {e!r}",
              on_exceptions=IOError,
              reraise=True)
@log_on_end(logging.DEBUG, "Downloading {url:s} finished successfully within {result.elapsed!s}")
def download(url):
    # some code
    response = requests.get(url)
    # some more code
    return response


logging.basicConfig(level=logging.DEBUG)

download("https://www.sighalt.de")
# DEBUG:__main__:Start downloading https://www.sighalt.de...
# DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): www.sighalt.de
# DEBUG:urllib3.connectionpool:https://www.sighalt.de:443 "GET / HTTP/1.1" 200 None
# DEBUG:__main__:Downloading https://www.sighalt.de finished successfully within 0:00:00.130960

download("https://www.sighalt.der")
# DEBUG:__main__:Start downloading https://www.sighalt.der...
# DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): www.sighalt.der
# ERROR:__main__:Error on downloading https://www.sighalt.der: ConnectionError(MaxRetryError("
# HTTPSConnectionPool(host='www.sighalt.der', port=443): Max retries exceeded with url: /
# (Caused by NewConnectionError(':
# Failed to establish a new connection: [Errno -2] Name or service not known',))",),)

thông điệp

Thông báo để ghi nhật ký

def download():
    # some download code
    pass

if __name__ == "__main__":
    download()

tiều phu

import logging
from .exceptions import MyException1, MyException2

logger = logging.getLogger(__name__)


def download():
    logger.debug("Start downloading")
    # some download code
    logger.debug("Downloading finished successfully")


if __name__ == "__main__":
    try:
        download()
    except (MyException1, MyException2):
        logger.error("Error on downloading")
        raise

Một đối tượng logger thay thế. Nếu không có logger nào được cung cấp logdecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (

def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7

người xử lý

import logging
from logdecorator import log_on_start, log_on_end, log_on_error
from .exceptions import MyException1, MyException2


@log_on_start(logging.DEBUG, "Start downloading")
@log_on_error(logging.ERROR, "Error on downloading",
              on_exceptions=(MyException1, MyException2),
              reraise=True)
@log_on_end(logging.DEBUG, "Downloading finished successfully")
def download():
    # some download code


if __name__ == "__main__":
    download()

Một đối tượng xử lý nhật ký tùy chỉnh. Chỉ có sẵn nếu không có đối tượng logger được đưa ra.

on_exceptions

Một tuple chứa các lớp ngoại lệ hoặc một ngoại lệ duy nhất, sẽ bị bắt và kích hoạt việc ghi nhật ký của bộ trang trí def x(a = 1, b = 2, *args, **kwargs): print a, b, args, kwargs def y(*args, **kwargs): x(*args, **kwargs) >>> y(3, 4, 5, 6) 3 4 (5, 6) {} >>> y(3, 4, 5, b=6) TypeError: x() got multiple values for keyword argument 'b' 3. Mặc định: tuple () (không có ngoại lệ nào bị bắt)

Kiểm soát nếu các ngoại lệ bị bắt sẽ được rera hóa sau khi đăng nhập. Mặc định: Sai

  • log_on_start
  • log_on_end
  • log_on_error
  • log_exception

Tên biến người ta có thể sử dụng trong thông báo để tham khảo ngoại lệ bị bắt được nêu trong hàm được trang trí, ví dụ: @log_on_error (lỗi, "lỗi là: {e! r}", ...) mặc định: "e"

LogDecorator

  • async_log_on_start
  • async_log_on_end
  • async_log_on_error
  • async_log_exception

Di chuyển mã đăng nhập ra khỏi logic kinh doanh của bạn với các nhà trang trí Python.

Ghi nhật ký là một công cụ đẹp trong hộp công cụ của bạn để truy tìm các lỗi và hiểu rõ hơn về cách ứng dụng của bạn hoạt động trong sản xuất. Nhưng nếu bạn giống như tôi, bạn thường bỏ qua mã ghi nhật ký, vì vậy nó sẽ không ẩn logic kinh doanh hoặc có mã của bạn với độ phức tạp.

May mắn thay, người trang trí Pythons hiện đã đến giải cứu của chúng tôi và cung cấp cho chúng tôi một thư viện đẹp để thêm ghi nhật ký vào mã của chúng tôi mà không ăn cắp khả năng đọc và dễ hiểu.

Nếu bạn muốn biết thêm về ý định đằng sau LogDecorator, hãy xem bài đăng trên blog của tôi.

import logging
from logdecorator import log_on_start
from .exceptions import MyException1, MyException2


@log_on_start(logging.DEBUG, "Start downloading '{url:s}'")
def download(url):
    # some download code


if __name__ == "__main__":
    download("http://my.file.com/file.bin")

CẬP NHẬT: LogDecorator == 2.0

Cảm ơn tất cả những người phụ thuộc :) Tôi vừa phát hành một phiên bản mới của LogDecorator (2.0). Bạn có thể đọc các thay đổi tại blog của tôi hoặc trong Changelog.

Cài đặt

Cài đặt dễ dàng như nó có thể nhận được:

Làm thế nào để sử dụng nóCallable_format_varablelog_on_startlog_on_endlog_on_errorlog_exception
Tên biến người ta có thể sử dụng trong thông báo để tham khảo các cuộc gọi được trang trí có thể gọi được. ví dụ. @log_on_start (lỗi, "được gọi là {callable .__ Tên __: s}", ...) Mặc định: "Callable"log_exception / async_log_exceptionTranh luậnTranh luậnTranh luậnTranh luận
Sự mô tảmức đăng nhậpTranh luậnTranh luậnTranh luậnTranh luận
Sự mô tảmức đăng nhậpVângTranh luậnVângVâng
Mức nhật ký mà tin nhắn nên được gửithông điệpVângVângTranh luậnTranh luận

Sự mô tả

Tên biến người ta có thể sử dụng trong thông báo để tham khảo ngoại lệ bị bắt được nêu trong hàm được trang trí> ví dụ: @log_on_error (lỗi, "lỗi là: {e! r}", ...) mặc định: "e"required?Callable_format_varable
Tên biến người ta có thể sử dụng trong thông báo để tham khảo các cuộc gọi được trang trí có thể gọi được. ví dụ. @log_on_start (lỗi, "được gọi là {callable .__ Tên __: s}", ...) Mặc định: "Callable"log_exception / async_log_exceptionTranh luận
thông điệpVângThông báo để ghi nhật ký
tiều phukhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7

người xử lý

Một đối tượng xử lý nhật ký tùy chỉnh. Chỉ có sẵn nếu không có đối tượng logger được đưa ra.required?Callable_format_varable
Tên biến người ta có thể sử dụng trong thông báo để tham khảo các cuộc gọi được trang trí có thể gọi được. ví dụ. @log_on_start (lỗi, "được gọi là {callable .__ Tên __: s}", ...) Mặc định: "Callable"Vânglog_on_end / async_log_on_end
thông điệpVângThông báo để ghi nhật ký
tiều phukhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7

người xử lý

Một đối tượng xử lý nhật ký tùy chỉnh. Chỉ có sẵn nếu không có đối tượng logger được đưa ra.required?Callable_format_varable
Tên biến người ta có thể sử dụng trong thông báo để tham khảo các cuộc gọi được trang trí có thể gọi được. ví dụ. @log_on_start (lỗi, "được gọi là {callable .__ Tên __: s}", ...) Mặc định: "Callable"Vânglog_on_end / async_log_on_end
thông điệpVângThông báo để ghi nhật ký
tiều phukhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7

người xử lý

Một đối tượng xử lý nhật ký tùy chỉnh. Chỉ có sẵn nếu không có đối tượng logger được đưa ra.required?Callable_format_varable
Tên biến người ta có thể sử dụng trong thông báo để tham khảo các cuộc gọi được trang trí có thể gọi được. ví dụ. @log_on_start (lỗi, "được gọi là {callable .__ Tên __: s}", ...) Mặc định: "Callable"Vânglog_on_end / async_log_on_end
thông điệpVângThông báo để ghi nhật ký
tiều phukhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7
người xử lýkhôngMột đối tượng xử lý nhật ký tùy chỉnh. Chỉ có sẵn nếu không có đối tượng logger được đưa ra.
người xử lýkhôngMột đối tượng xử lý nhật ký tùy chỉnh. Chỉ có sẵn nếu không có đối tượng logger được đưa ra.
người xử lýkhôngMột đối tượng logger thay thế. Nếu không có logger nào được cung cấp logDecorator, hãy tạo một đối tượng logger với tên của mô -đun, hàm được trang trí nằm trong (____ 17) mặc định: Tạo một logger mới với tên
def x(*args, **kwargs):
    kwargs.updae({'a': 1, 'b': 2})
7