2012-04-19 23 views
11

Tôi đang làm việc với xlwt có giới hạn 4k về số lượng kiểu có thể được xác định trong tài liệu excel.Làm thế nào để băm * args ** kwargs cho bộ nhớ cache chức năng?

Thông thường, người ta tạo ra phong cách như vậy:

style = xlwt.easyxf("font: bold 1") 

Mà tôi chỉ đơn giản là thay thế bằng

def cached_easyxf(self, format): 
    return self._cache.setdefault(format, xlwt.easyxf(format)) 

Những hoạt động hoàn hảo. Bây giờ, tôi đã phát hiện ra rằng tôi cần phải vượt qua trong đối số từ khóa đôi khi mà tôi đã suy nghĩ: làm thế nào tôi nên băm chữ ký args/kwargs?

Tôi có nên tạo khóa bộ nhớ cache dựa trên str (giá trị) không? Pickle? Điều gì là mạnh mẽ nhất?

Đối với hoàn cảnh của tôi có vẻ như tôi chỉ có thể chuyển đổi khóa/giá trị cho xâu kí tự và thêm nó vào chìa khóa của tôi ... nhưng Tôi bây giờ tò mò về một cách chung chung để xử lý này với nói loại unhashable như arg=[1, 2, 3]

def cached_call(*args, **kwargs): 
    return cache.get(what_here) 
cached_call('hello') 
cached_call([1, 2, 3], {'1': True}) 

Trả lời

10

đây là kỹ thuật được sử dụng trong functools.lru_cache():

kwd_mark = object()  # sentinel for separating args from kwargs 

def cached_call(*args, **kwargs): 
    key = args + (kwd_mark,) + tuple(sorted(kwargs.items())) 
    return cache.get(key) 

Lưu ý, các mã trên xử lý đối số từ khóa nhưng không có sự nỗ lực để xử lý các giá trị phi hashable như danh sách. Ý tưởng của bạn khi sử dụng số str của danh sách là một khởi đầu hợp lý. Đối với các đối tượng đặt, trước tiên bạn cần sắp xếp các mục nhập, str(sorted(someset)). Các đối tượng khác có thể không có một __repr__ hoặc __str__ hữu ích (nghĩa là chúng chỉ có thể hiển thị loại đối tượng và vị trí trong bộ nhớ). Tóm lại, xử lý các đối số không thể sửa đổi tùy ý yêu cầu xem xét cẩn thận từng loại đối tượng.

+1

Cảm ơn câu trả lời Raymond! Nhiều đánh giá cao –

+0

Công việc sau đây cũng sẽ như sau: 'key = (args, tuple (được sắp xếp (kwds.items())))'? Hoặc là nó chậm hơn vì các bộ bên trong? – max

+0

@max Có, điều đó sẽ hiệu quả. Và có, các con trỏ bổ sung sẽ làm chậm nó xuống một chút cũng như tiêu thụ nhiều bộ nhớ hơn một chút. –

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