2015-06-20 22 views
12

Tôi có một chức năng:luận Tùy chọn chức năng lambda

cost(X, model, reg = 1e-3, sparse) 

Và tôi cần phải vượt qua chức năng này với nhau dưới hình thức:

f(X, model) 
f(X, model, reg = reg) 

Tôi đang sử dụng lambda để làm điều này:

f = lambda X, model: cost(X, model, sparse = np.random.rand(10,10)) 

Và python phàn nàn rằng lambda có đối số không mong muốn reg. Làm thế nào để tôi làm điều này một cách chính xác?

Nếu tôi làm theo cách khác:

f = lambda X, model, reg: cost(X, model, reg = reg, sparse = np.random.rand(10,10)) 

Sau đó, nó không làm việc trong trường hợp đầu tiên.

+1

Trong cuộc gọi hàm, đối số từ khóa phải tuân theo các đối số vị trí. Vì vậy, tôi tin rằng hàm 'cost' của bạn nên là một cái gì đó tương tự như' chi phí (X, mô hình, reg = 1e-3, thưa thớt = 'somethingelse'' hoặc 'chi phí (X, mô hình, thưa thớt, req = 1e-3)' – poros

Trả lời

12

Lambda lấy chữ ký giống như chức năng thông thường, và bạn có thể cho reg một mặc định:

f = lambda X, model, reg=1e3: cost(X, model, reg=reg, sparse=np.random.rand(10,10)) 

mặc gì bạn cung cấp cho nó phụ thuộc vào những gì mặc định các cost chức năng đã được gán cho tham số đó tương tự. Các giá trị mặc định này được lưu trữ trên hàm đó trong cấu trúc cost.__defaults__, khớp với tên đối số. Nó có lẽ là dễ nhất để sử dụng inspect.getargspec() function đến nội quan mà thông tin:

from inspect import getargspec 

spec = getargspec(cost) 
cost_defaults = dict(zip(spec.args[-len(defaults:], spec.defaults)) 
f = lambda X, model, reg=cost_defaults['reg']: cost(X, model, reg=reg, sparse=np.random.rand(10,10)) 

Ngoài ra, bạn chỉ có thể vượt qua trên bất kỳ tranh luận thêm keyword:

f = lambda X, model, **kw: cost(X, model, sparse=np.random.rand(10,10), **kw) 
+0

Đối số mặc định của lambda nên giống như trong hàm ban đầu – Daniel

+0

Bất kỳ lý do nào không sử dụng 'partial()' hoặc tôi thiếu một cái gì đó? – dhke

+0

@dhke: bạn đang có, bạn cần phải thực hiện 'np.random. rand() 'gọi mỗi lần khi bạn gọi' f() ', không chỉ một lần khi tạo một' partial() '. –

4

bạn đã thử một cái gì đó giống như

f = lambda X, model, **kw: cost(X, model, sparse = np.random.rand(10,10), **kw)

rồi reg (và bất kỳ đối số nào khác có tên yo u muốn đi qua (khác hơn thưa thớt)) nên làm việc tốt.

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