如果之前使用过参数,则防止多次调用函数
Prevent calling a function more than once if the parameters have been used before
我想要一种方法来限制每个参数值对函数的调用一次。
例如
def unique_func(x):
return x
>>> unique_func([1])
[1]
>>> unique_func([1])
*** wont return anything ***
>>> unique_func([2])
[2]
有什么建议吗?我研究过使用记忆,但尚未建立解决方案。
建议的 无法解决此问题,因为只有在 上一个 函数调用具有参数时才能解决。
Memoization 使用参数到 return 值的映射。在这里,您只需要将参数映射到 None
,这可以用一个简单的集合来处理。
def idempotize(f):
cache = set()
def _(x):
if x in cache:
return
cache.add(x)
return f(x)
return _
@idempotize
def unique_fun(x):
...
只要小心,这可以推广到处理具有多个参数的函数,只要它们是可散列的。
def idempotize(f):
cache = set()
def _(*args, **kwargs):
k = (args, frozenset(kwargs.items()))
if k in cache:
return
return f(*args, **kwargs)
return _
考虑使用内置的 functools.lru_cache()
而不是自己滚动。
在具有相同参数的第二个函数调用中不会 return 任何内容(它将 return 与第一个函数调用相同)但也许您可以接受。与使用作为标准库的一部分维护的东西的优势相比,这似乎是一个可以忽略不计的代价。
要求您的参数 x
可哈希,因此不适用于列表。字符串很好。
from functools import lru_cache
@lru_cache()
def unique_fun(x):
...
我想要一种方法来限制每个参数值对函数的调用一次。
例如
def unique_func(x):
return x
>>> unique_func([1])
[1]
>>> unique_func([1])
*** wont return anything ***
>>> unique_func([2])
[2]
有什么建议吗?我研究过使用记忆,但尚未建立解决方案。
建议的
Memoization 使用参数到 return 值的映射。在这里,您只需要将参数映射到 None
,这可以用一个简单的集合来处理。
def idempotize(f):
cache = set()
def _(x):
if x in cache:
return
cache.add(x)
return f(x)
return _
@idempotize
def unique_fun(x):
...
只要小心,这可以推广到处理具有多个参数的函数,只要它们是可散列的。
def idempotize(f):
cache = set()
def _(*args, **kwargs):
k = (args, frozenset(kwargs.items()))
if k in cache:
return
return f(*args, **kwargs)
return _
考虑使用内置的 functools.lru_cache()
而不是自己滚动。
在具有相同参数的第二个函数调用中不会 return 任何内容(它将 return 与第一个函数调用相同)但也许您可以接受。与使用作为标准库的一部分维护的东西的优势相比,这似乎是一个可以忽略不计的代价。
要求您的参数 x
可哈希,因此不适用于列表。字符串很好。
from functools import lru_cache
@lru_cache()
def unique_fun(x):
...