如何在list
中編寫一個存儲該函數輸入的裝飾器,並且只有在存儲了n
之後才調用該函數?修飾器將輸入存儲在列表中以調用每個`n`調用?
0
A
回答
0
呼籲func
每10萬個電話,與@counter
使用您函數之前:
def counter(func):
def wrapper(val, *args, **kwargs):
if val:
wrapper.count = wrapper.count + 1
if wrapper.count % 100000 == 0: # insert 100,000 at a time, should be speedier thanks to `.executemany()`
to_logfile(str(wrapper.count) + '\n', 'counter2.log')
return func(wrapper.valarr, *args, **kwargs)
else:
if len(wrapper.valarr)==1000000:
wrapper.vallarr = []
wrapper.valarr.append([val])
return
wrapper.count = 0
wrapper.valarr = []
return wrapper
(隨時提出改進)
0
這裏有一個類實現,正如其他人所提交的功能implentations:
class IntervalCache(object):
def __init__(self, f):
self._f = f
self._cache = []
self._n = 0
self._interval = 1000
def __call__(self, *args, **kwargs):
if self._n == self._interval:
result = [self.f(*c_args, **c_kwargs) for c_args, c_kwargs in self._cache]
self._n = 0
self._cache = []
return result + [self.f(*args, **kwargs)]
else:
self._cache.append((*args, **kwargs))
self._n += 1
@property
def getCache(self):
return self._cache
def resetCache(self):
self._cache = []
self._n = 0
def getInterval(self):
return self._interval
def setInterval(self, value):
self._interval = value
interval = property(getInterval, setInterval)
用法:
#wrapping a function
@IntervalCache
def foo(*args, **kwargs):
print args, kwargs
return True
#setting the caching interval
foo.interval = 10
#calling foo a bunch of times
for i in range(20):
print foo(i, i+1, bar=i*2)
#retrieving the contents of the cache
print foo.getCache()
#resetting the contents of the cache
foo.resetCache()
0
我要假定
- 你的函數接受任何數目的位置參數
f(a); f(b)
相同f(a, b)
- 它沒有返回值(任何結果的發生是由於副作用)
。
import functools
class Batcher(object):
def __init__(self, n=100):
self.n = n
def __call__(self, fn):
@functools.wraps(fn)
def _fn(*args):
_fn.cache.extend(args)
_fn.calls += 1
if _fn.calls == _fn.n:
fn(*_fn.cache)
_fn.cache = []
_fn.calls = 0
_fn.n = self.n
_fn.cache = []
_fn.calls = 0
return _fn
然後測試它,
@Batcher(20)
def mysum(*args):
print sum(args)
for i in range(1,25):
mysum(i)
打印
210 # <- result of sum(1..20)
相關問題
- 1. ,可以由每個用戶調用列表存儲過程
- 2. 將一個裝飾器列表應用於可調用?
- 3. 修飾器模式方法調用
- 4. Python函數修飾器調用
- 5. 修飾器不調用封裝函數
- 6. 將用戶輸入存儲在數組或陣列列表中
- 7. 如何在Python中將用戶輸入存儲到列表中
- 8. python調用序列中的裝飾器
- 9. 在Sequelize中調用輸入/輸出類型存儲過程
- 10. 如何將修飾符用戶存儲在Symfony 2實體中
- 11. 調用列表中的每個函數
- 12. 每n秒調用一次存儲過程
- 13. 在行中存儲多個列表,所以我可以調用每一行並進行操作
- 14. 在C#中創建用於調用Oracle存儲過程的輸入表參數
- 15. 在sql server 2008中使用表類型輸入參數調用存儲過程
- 16. 如何將用戶輸入存儲到列表中?
- 17. Python程序將首N個素數存儲在列表中?
- 18. 如何將Flask-RESTPlus的裝飾器用於每個函數調用?
- 19. 在第二個表中將N列中的值乘以N列?
- 20. 如何調用python日期列表中的每個第n個元素?
- 21. 從C#中調用參數輸入變量的Oracle存儲過程調用
- 22. 如何手動調用dbus.service.signal修飾符?
- 23. 我可以將我的表格存儲調用緩存在天藍色中嗎?
- 24. 在存儲過程中從插入調用存儲過程
- 25. 如何將多個輸入存儲到列表中C++
- 26. 可以存儲過程調用截斷veiw表並將數據輸入到MySql中的視圖表
- 27. 如何通過列表輸入到ASP經典存儲過程調用
- 28. 將system()調用的輸出存儲到一個變量
- 29. 從java中調用輸入和輸出參數的多個存儲過程
- 30. 如何調用存儲過程在表中插入值