Tôi nghĩ rằng áp dụng một trang trí en-masse như vậy mà nó không rõ ràng nơi bạn sẽ tìm kiếm để tìm hiểu về chức năng (theo định nghĩa của nó) thường là một ý tưởng tồi. Rõ ràng là tốt hơn so với tiềm ẩn, và tất cả những điều đó.
Nếu bạn muốn áp dụng trang trí vào các chức năng một số mô-đun bên thứ ba, mà không sửa đổi mã của bên thứ ba, ở đây là làm thế nào tôi sẽ làm điều đó:
# my_wrapper_module.py
import some_module
import functools
def some_decorator(func):
@functools.wraps(func):
def wrapper(*args, **kwargs):
...
return wrapper
FUNCTION_NAMES = [
'some_func_1',
'some_func_2',
'some_func_3',
...
]
for name in FUNCTION_NAMES:
globals()[name] = some_decorator(getattr(some_module, name))
Và sau đó sử dụng các chức năng khác bằng cách làm from my_wrapper_module import some_func_2
vv
Đối với tôi, điều này có những ưu điểm sau:
- Không cần phải sửa đổi các tập tin nguồn của bên thứ ba
- Rõ ràng từ trang gọi mà tôi nên xem
my_wrapper_module
để xem những gì tôi đang gọi và tôi không sử dụng các phiên bản chưa được đặt trước của các chức năng
- Rõ ràng là từ
my_wrapper_module
chức năng nào đang được xuất , ban đầu chúng xuất phát từ some_module
và tất cả chúng đều có cùng trang trí được áp dụng
- Bất kỳ mã nào nhập
some_module
trực tiếp không bị âm thầm và không thể giải thích được; điều này có thể đặc biệt quan trọng nếu mã của bên thứ ba là nhiều hơn một mô-đun
Nhưng nếu những gì bạn đang cố gắng làm là hack một thư viện của bên thứ ba để các cuộc gọi nội được bị ảnh hưởng, thì đây là không phải những gì bạn muốn.
Điều này là hoàn toàn an toàn - và tôi thực sự sử dụng những thứ như thế này trong một dự án thực sự. – jsbueno
Cảm ơn bạn đã trả lời! Điều này làm việc cho tôi, nhưng có một vấn đề nhỏ mà nó cũng bổ sung thêm các chức năng mà tôi đã nhập (như "từ bản sao nhập sâu") ... có cách tôi có thể bỏ qua các chức năng này và chỉ thêm các chức năng mà tôi bản thân tôi được xác định ở cấp cao nhất trong mô-đun? ... cảm ơn! – Rajat
thay thế "vars (othermodule) [k] = my_decorator (v)" với "setattr (othermodule, k, my_decorator (v))" để tránh có thể "'dictproxy' đối tượng không hỗ trợ phân công mục" – user2426679