如果之前使用过参数,则防止多次调用函数

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):
    ...