使用函数装饰器从集合中删除一个值
Remove a value from a set with a function decorator
有没有办法通过使用装饰器从集合中删除一个项目?我有一个函数可以生成一个数字的所有因子 - num 和 return 一组。对于我正在处理的问题,我想 return 排除值 - 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])
这是一个装饰器,它修改了一个 returns 集合的函数,这样返回的集合就没有函数参数:
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}
我还没有用一个有多个参数的函数测试过它。
有没有办法通过使用装饰器从集合中删除一个项目?我有一个函数可以生成一个数字的所有因子 - num 和 return 一组。对于我正在处理的问题,我想 return 排除值 - 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])
这是一个装饰器,它修改了一个 returns 集合的函数,这样返回的集合就没有函数参数:
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}
我还没有用一个有多个参数的函数测试过它。