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
và
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 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 [ 7] mặc định: Tạo một logger mới với tên 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'] |
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 Sự mô tảException_format_varable
Tranh luận
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["//www.sighalt.de"] # DEBUG:__main__:Start downloading //www.sighalt.de... # DEBUG:urllib3.connectionpool:Starting new HTTPS connection [1]: www.sighalt.de # DEBUG:urllib3.connectionpool://www.sighalt.de:443 "GET / HTTP/1.1" 200 None # DEBUG:__main__:Downloading //www.sighalt.de finished successfully within 0:00:00.130960 download["//www.sighalt.der"] # DEBUG:__main__:Start downloading //www.sighalt.der... # DEBUG:urllib3.connectionpool:Starting new HTTPS connection [1]: www.sighalt.der # ERROR:__main__:Error on downloading //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}]
7ngườ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]
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'
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["//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:
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 | Tranh luận | Tranh luận | Tranh luận |
Sự mô tả | mức đăng nhập | Tranh luận | Tranh luận | Tranh luận | Tranh luận |
Sự mô tả | mức đăng nhập | Vâng | Tranh luận | Vâng | Vâng |
Mức nhật ký mà tin nhắn nên được gửi | thông điệp | Vâng | Vâng | Tranh luận | Tranh 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 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 |
thông điệp | Vâng | 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 7 |
người xử lý | 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 7 |
người xử lý | 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 7 |
người xử lý
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âng | log_on_end / async_log_on_end |
thông điệp | Vâng | 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 7 |
người xử lý | 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 7 |
người xử lý | 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 7 |
người xử lý | 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 7 |
người xử lý
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âng | log_on_end / async_log_on_end |
thông điệp | Vâng | 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 7 |
người xử lý | 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 7 |
người xử lý | 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 7 |
người xử lý | 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 7 |
người xử lý | 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 7 |
người xử lý | 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 7 |
người xử lý
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âng | log_on_end / async_log_on_end |
thông điệp | Vâng | 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 7 |
người xử lý | 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 7 |
người xử lý | 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 7 |
người xử lý | không | 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. |
người xử lý | không | 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. |
người xử lý | 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 7 |