Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用函数装饰器从集合中删除值_Python_Wrapper_Decorator - Fatal编程技术网

Python 使用函数装饰器从集合中删除值

Python 使用函数装饰器从集合中删除值,python,wrapper,decorator,Python,Wrapper,Decorator,有没有办法通过使用装饰器从集合中删除一个项目?我有一个函数来生成一个number-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

有没有办法通过使用装饰器从集合中删除一个项目?我有一个函数来生成一个number-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])

下面是一个修饰符,它修改返回集合的函数,使返回的集合没有函数参数:

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
删除值本身似乎足够简单,并且您在示例中使用
remove_last
的方式表明您可能需要一个API,而不是decorators提供的API。
>>> factors(10)
{1, 2, 5}