Đây là giải pháp của tôi qua trang trí:
def showargs(function):
def inner(*args, **kwargs):
return function((args, kwargs), *args, **kwargs)
return inner
@showargs
def some_func(info, arg1, arg2, arg3=1, arg4=2):
print arg1,arg2,arg3,arg4
return info
In [226]: some_func(1,2,3, arg4=4)
1 2 3 4
Out[226]: ((1, 2, 3), {'arg4': 4})
Có thể có một cách để làm sạch này lên xa hơn, nhưng điều này dường như ít xâm nhập đối với tôi và không yêu cầu phải thay đổi mã gọi.
Edit: Để thực sự kiểm tra nếu args đặc biệt được thông qua theo từ khóa, sau đó làm một cái gì đó như sau bên trong của some_func:
args, kwargs = info
if 'arg4' in kwargs:
print "arg4 passed as keyword argument"
Disclaimer: có lẽ bạn nên xem xét hay không, bạn thực sự quan tâm cách các đối số được thông qua. Toàn bộ cách tiếp cận này có thể là không cần thiết.
Tôi không nghĩ vậy ... tại sao một người lại bận tâm với ** kw? – jldupont
Tôi xin lỗi, nhưng nếu nó chỉ là sự tò mò của bạn, tôi sẽ bỏ phiếu để đóng, không có vấn đề thực sự, không có trường hợp sử dụng, và không ai sẽ gặp vấn đề bạn đang mơ. – SilentGhost
Thực ra, tôi đã gặp phải vấn đề đó một lần. Tôi đã viết một hàm để tạo một trình bao bọc XML (thêm một thẻ bắt đầu và gắn thêm một thẻ kết thúc) xung quanh một số CDATA và muốn nó trông giống như 'def wrap (tag, contents = None, ** attrs):', nhưng sau đó chạy thẳng vào vấn đề mà các thuộc tính có thể có các ký tự mà các mã định danh Python không thể. Nhưng đó là một bài tập thú vị trong vài phút. –