【问题标题】:Remove a value from a set with a function decorator使用函数装饰器从集合中删除一个值
【发布时间】:2016-08-02 08:35:21
【问题描述】:

有没有办法通过使用装饰器从集合中移除一个项目?我有一个函数可以生成一个数字的所有因子 - num,并返回一个集合。对于我正在处理的问题,我想返回不包括值的集合 - num。我想通过使用装饰器来做到这一点,但不确定如何。

我在 euler.py 中的因子函数:

def factors(n):    
    return set(reduce(list.__add__, 
               ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))

我要装饰的功能:

from euler import factors

def remove_last(func, *args, **kwargs):
    def wrapper(x):
         func.remove(x)
    return func

factors = remove_last(factors(10)) 
print factors

当前输出:

set([1, 10, 2, 5])

想要的输出:

set([1, 2, 5])

【问题讨论】:

  • 你有什么特别的理由想用装饰器来做这个吗?简单地让 factors 删除值本身似乎很简单,并且您在示例中使用 remove_last 的方式表明您可能需要一个不同于装饰器提供的 API。

标签: python wrapper decorator


【解决方案1】:

这是一个修饰器,它修改了一个返回集合的函数,使得返回的集合没有函数参数:

def proper(func):
    def f(*args, **kwargs):
        s = func(*args, **kwargs)
        return s.difference(args)
    return f

例如:

@proper

def factors(n):    
    return set(reduce(list.__add__, 
               ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))

然后:

>>> factors(10)
{1, 2, 5}

我还没有使用具有多个参数的函数对其进行测试。

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 2015-02-22
    • 2021-09-17
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多