2012-09-24 23 views
8

thể trùng lặp:
How can I programmatically change the argspec of a function in a python decorator?bảo tồn argspec khi trang trí?

argspec là một cách tuyệt vời để có được lập luận của một hàm, nhưng nó không hoạt động khi các chức năng đã được trang trí:

def dec(func): 
    @wraps(func) 
    def wrapper(*a, **k) 
     return func() 
    return wrapper 


@dec 
def f(arg1, arg2, arg3=SOME_VALUE): 
    return 

import inspect 
print inspect.argspec(f) 

----------- 

ArgSpec(args=[], varargs='a', keywords='k', defaults=None) 

Argspec phải trả lại arg1, arg2, arg3. Tôi nghĩ rằng tôi cần xác định wrapper khác nhau là không sử dụng *a**k, nhưng tôi không biết cách thực hiện.

+1

Tôi rất vui vì có một mô-đun bên thứ 3 giải quyết được vấn đề của chúng tôi, vì vậy nhờ @MuMind đã chỉ ra, nhưng * tại sao * không được xử lý bởi thư viện chuẩn '' functools.wraps'' của Python trang trí, như bạn và tôi đều mong đợi? Đó là chính xác những gì nó cho, sau khi tất cả. Báo cáo lỗi? – pmos

+0

Đối với những người quan tâm, tôi đã mở hộp giun ở đây: http://bugs.python.org/issue23764 – pmos

Trả lời

9

Module decorator bảo họ tốt:

from decorator import decorator 
@decorator 
def dec(func, *a, **k): 
    return func() 

@dec 
def f(arg1, arg2, arg3=1): 
    return 

import inspect 
print inspect.getargspec(f) 
ArgSpec(args=['arg1', 'arg2', 'arg3'], varargs=None, keywords=None, defaults=(1,)) 

Bạn có lẽ có thể có được hiệu quả tương tự bằng cách thủ công sao chép một số __foo__ thuộc tính từ các chức năng để các chức năng bao bọc, nhưng dù sao các module trang trí thể hiện nó có thể và có thể cung cấp cho bạn một điểm khởi đầu.

+0

Điều này trả lời câu hỏi của tôi, nhưng tôi bummed rằng mô-đun trang trí dường như không hỗ trợ trang trí có tham số. – priestc

+0

Bạn có nghĩa là trang trí "nhà máy", như '@dec (1, 2)'? –

+0

yeah thats những gì tôi có nghĩa là – priestc

Các vấn đề liên quan