Python không hỗ trợ các chức năng ẩn danh phức tạp. Một lựa chọn tốt là gì? Ví dụ:python: thay thế cho các chức năng ẩn danh
class Calculation:
def __init__(self, func):
self.func = func
def __call__(self, data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[self.func]
except KeyError:
pass # first-time call; calculate and cache the values
data[self.func] = self.func(data)
return data[self.func]
# with a simple function, which can be represented using lambda, this works great
f1 = Calculation(lambda data : data['a'] * data['b'])
# with a complicated function, I can do this:
def f2_aux:
# some complicated calculation, which isn't suitable for a lambda one-liner
f2 = Calculation(f2_aux)
Đây có phải là thiết kế hợp lý để bắt đầu không?
Nếu có, có cách nào để tránh sự xấu xí của f * _aux cho mỗi f * mà tôi xác định trong mô-đun không?
UPDATE:
Ví dụ về sử dụng:
d = {'a' : 3, 'b' : 6}
# computes 3 * 6
# stores 18 in d under a key <function <lambda> at ...>
# returns 18
f1(d)
# retrieves 18 from d[<function <lambda> at ...>]
# returns 18, without having to recalculate it
f1(d)
UPDATE:
Chỉ cần cho sự hiểu biết của tôi, tôi đã thêm một phiên bản sử dụng các chức năng bên trong.
def memoize(func):
def new_func(data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[func]
except KeyError:
pass # first-time call; calculate and cache the values
data[func] = func(data)
return data[func]
return new_func
@memoize
def f1(data):
return data['a'] * data['b']
Không, đây không phải là thiết kế hợp lý. Dường như bạn đang thực hiện việc ghi nhớ (không liên quan đến các chức năng ẩn danh) và làm việc đó rất tệ. 'f1 = lambda a: expression' luôn giống hệt' def f1 (a): biểu thức trả về'. [Đây là một trang trí ghi nhớ tốt để nghiên cứu] (http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize). BTW, '@ decorator def function: pass' luôn chính xác giống như' def function: pass; function = decorator (function) ' –
Điều gì là xấu là memoizer của bạn bị hỏng. Bộ nhớ cache kết quả 'dữ liệu' cũng là đối số cho hàm của bạn ... –
@FrancisAvila: Tôi dự định lưu trữ giá trị của' f (dữ liệu) 'trong phần tử từ điển' data [f] '. Tôi biết rằng 'dữ liệu' được truyền cho tôi sẽ không bao giờ sử dụng khóa như vậy - và xung đột với một khóa khác không nên xảy ra vì giá trị của một hàm khác sẽ được lưu trong một khóa khác. Dường như nó hoạt động (về mặt kỹ thuật); là vấn đề chỉ trong mã khó hiểu không cần thiết? – max