2012-08-02 29 views
9

Tôi đang sử dụng getattr để gọi các hàm khác nhau tùy thuộc vào biến.Python sử dụng hàm getattr để gọi với tham số biến

Im làm một cái gì đó như thế:

getattr(foo, bar)() 

đó làm việc, kêu gọi các chức năng như foo.bar()

Vấn đề của tôi là tôi có chức năng 'bar' và tôi muốn gọi nó với nhau thông số. Ví dụ:

def f1() : 
    pass 

def f2(param1) : 
    pass 

def f3(param1,param2) : 
    pass 

để 'bar' có thể là f1, f2, hoặc f3

Tôi cố gắng này: assumming rằng params được một danh sách chứa tất cả các thông số cần thiết cho các chức năng 'bar'

getattr(foo, bar) (for p in params :) 

tôi xem cho một giải pháp "sạch", không có cần thiết để xem độ dài trên params biến

Trả lời

16

Bạn có thể thử một cái gì đó như:

getattr(foo, bar)(*params) 

Điều này hoạt động nếu params là danh sách hoặc bộ dữ liệu. Các yếu tố từ params sẽ được giải nén theo thứ tự:

params=(1, 2) 
foo(*params) 

tương đương với:

params=(1, 2) 
foo(params[0], params[1]) 

Nếu có đối số từ khóa, bạn có thể làm điều đó quá.

getattr(foo, bar)(*params, **keyword_params) 

nơi keyword_params là từ điển.

Ngoài ra, Câu trả lời này thực sự độc lập với getattr. Nó sẽ làm việc cho bất kỳ hàm/phương thức nào.

+2

Tôi biết OP không hỏi cụ thể, nhưng tôi cũng sẽ thêm '** kwargs', vì vậy anh ta không kết thúc với việc khó theo dõi lỗi sau này nếu anh ta cố gắng sử dụng các đối số từ khóa. –

+0

@ sr2222 - Đã thêm. – mgilson

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