Giả sử chúng ta có một hàm API phức tạp, được nhập từ một số thư viện.
def complex_api_function(
number, <lots of positional arguments>,
<lots of keyword arguments>):
'''really long docstring'''
# lots of code
Tôi muốn viết một trình bao bọc đơn giản xung quanh chức năng đó để tạo ra một thay đổi nhỏ. Ví dụ , có thể truyền đối số đầu tiên dưới dạng chuỗi. Làm thế nào để tài liệu này? Tôi đã xem xét các lựa chọn sau:
Lựa chọn 1:
def my_complex_api_function(number_or_str, *args, **kwargs):
'''
Do something complex.
Like `complex_api_function`, but first argument can be a string.
Parameters
----------
number_or_str : int or float or str
Can be a number or a string that can be interpreted as a float.
<copy paste description from complex_api_function docstring>
*args
Positional arguments passed to `complex_api_function`.
**kwargs
Keyword arguments passed to `complex_api_function`.
Returns
-------
<copy paste from complex_api_function docstring>
Examples
--------
<example where first argument is a string, e.g. '-5.0'>
'''
return complex_api_function(float(number_or_str), *args, **kwargs)
Nhược điểm: Người dùng phải xem các tài liệu complex_api_function
để nhận thông tin về *args
và **kwargs
. Cần điều chỉnh khi bản sao dán các phần từ complex_api_function
thay đổi.
Lựa chọn 2:
Sao chép và dán complex_api_function
chữ ký của (thay vì sử dụng *args
và **kwargs
) và chuỗi của nó. Thực hiện một thay đổi nhỏ đối với chuỗi doc đề cập rằng đối số đầu tiên cũng có thể là một chuỗi. Thêm một ví dụ.
Nhược điểm: dài dòng, phải thay đổi khi complex_api_function
thay đổi.
Tùy chọn 3:
Trang trí my_complex_api_function
với functools.wraps(complex_api_function)
.
Nhược điểm: Không có thông tin number
cũng có thể là một chuỗi.
Tôi đang tìm kiếm một câu trả lời không xoay quanh chi tiết về những thay đổi trong đó my_complex_api_function
. Các thủ tục nên làm việc cho bất kỳ điều chỉnh nhỏ so với ban đầu complex_api_function
.
complex_api_function
mong đợi cho tham số của nó vì điều đó chỉ trùng lặp thông tin (có thể chúng cũng có nhiều tùy chọn). Có lẽ người dùng của trình bao bọc đã quen thuộc với chức năng ban đầu và nếu không, bạn luôn có thể trỏ chúng đến các tài liệu gốc. Dù sao, tôi nghĩ rằng đây là cách để đi, chỉ ghi lại những gì được thêm vào chức năng ban đầu + cung cấp chi tiết về cách loại mới được chuyển đổi thành loại ban đầu (những chi tiết đó có thể quan trọng). Tức là cách đối số đó được xử lý để tương thích với hàm ban đầu.