2010-08-20 36 views
8

Tôi đang tìm cách kiểm tra số lượng đối số mà hàm đã cho trong Python. Mục đích là để đạt được một phương pháp mạnh mẽ hơn để vá các lớp của tôi để kiểm tra. Vì vậy, tôi muốn làm một cái gì đó như thế này:Có cách nào để kiểm tra chữ ký của hàm bằng Python không?

class MyClass (object): 
    def my_function(self, arg1, arg2): 
     result = ... # Something complicated 
     return result 

def patch(object, func_name, replacement_func): 
    import new 

    orig_func = getattr(object, func_name) 
    replacement_func = new.instancemethod(replacement_func, 
          object, object.__class__) 

    # ... 
    # Verify that orig_func and replacement_func have the 
    # same signature. If not, raise an error. 
    # ... 

    setattr(object, func_name, replacement_func) 

my_patched_object = MyClass() 
patch(my_patched_object, "my_function", lambda self, arg1: "dummy result") 
# The above line should raise an error! 

Cảm ơn.

+0

"vá lớp của tôi cho kiểm tra"? Tại sao bạn không sử dụng các đối tượng giả? http://python-mock.sourceforge.net/? –

+1

Tôi mới sử dụng mocks. Tôi "lớn lên" cứng đầu và chắp vá. Tôi đang thực hành và tìm ra khi nào nên sử dụng cái nào, nhưng trong thời gian đó, tôi vẫn có các dự án để hoàn thành, và các bài kiểm tra để viết :). – mjumbewu

Trả lời

9

Bạn có thể sử dụng:

import inspect 
len(inspect.getargspec(foo_func)[0]) 

này sẽ không thừa nhận các thông số chiều dài thay đổi, như:

def foo(a, b, *args, **kwargs): 
    pass 
2

Mô-đun inspect cho phép bạn kiểm tra đối số của hàm. Điều này đã được hỏi một vài lần trên Stack Overflow; hãy thử tìm kiếm một số câu trả lời. Ví dụ:

Getting method parameter names in python

+0

Tôi hiểu. Tôi đã tìm kiếm một chút trước khi đăng, nhưng tôi đoán tôi nên sử dụng nhiều cụm từ tìm kiếm hơn. Xin lỗi vì phiền. – mjumbewu

+0

Không sao cả. Tuy nhiên, tốt hơn là chỉ cho bạn những câu trả lời khác, chứ không chỉ lặp lại mọi thứ ở đây. –

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