'tuple' 对象在我的代码中不可调用

'tuple' object is not callable on my code

def make_sequence(seq):
    def filter1(*func):
        new_filter = filter(func, seq)
        return tuple(new_filter)

    def filter_iterator(*func):
        new_seq = tuple(filter(func, seq))
        index = 0

        def next1():
            nonlocal index
            if index >= 0 and index < len(new_seq):
                ele = new_seq[index]
                index += 1
            else:
                index = 0
                ele = new_seq[index]
                index += 1
            return ele

        def reverse():
            nonlocal index
            index -= 1
            if index >= 0 and index < len(new_seq):
                ele = new_seq[index]
            else:
                index = len(new_seq) - 1
                ele = new_seq[index]
            return ele

        return {'next': next1, 'reverse': reverse}

    def reverse():
        return tuple(seq[::-1])

    def extend(new_seq):
        nonlocal seq
        seq += new_seq

    return {'filter': filter1, 'filter_iterator': filter_iterator, 'reverse': reverse, 'extend': extend}


s1 = make_sequence((1, 2, 3, 4, 5))
print(s1['filter'](lambda x: x % 2 == 0))

当我尝试从 fitlter1 return 元组时,出现错误:

'tuple' object is not callable.

我尝试做的是 filter1 获取参数 *args,因为当我调用 filiter1() 时没有任何函数,他 returns 序列没有改变。

我删除了你 def filter1(func): 上的 * 试试看,我注意到你的参数是 *func* 实际上它是一个元组当你在函数上放一些参数,看来你不需要*。我认为您需要搜索 *args and **kwargs

我已经 运行 它并得到了这个输出

(2, 4)
[Finished in 0.3s]

这里有一个快速示例,说明您收到该消息的原因。因为当您将 * 放入函数中的参数时,它的数据类型是 tuple.

def foo(*args):
    print(args)
    print(type(args))


foo(1)

输出:

(1,)
<class 'tuple'>

为什么会出现错误?

filter(func, seq)

filter 函数期望你的 func 是一个函数或者至少是 lambda 但它不是,它实际上是一个 tuple 一旦你把 * 在你的 def filter1(*func).


所以根据你在这里所说的。

What I try to do is the filter1 get the argument *args because when I will call filiter1() with nothing function he returns the sequence without change.

你可以用你的函数做的是

def filter1(func=None):
    if callable(func):
        new_filter = filter(func, seq)
        return tuple(new_filter)

    return seq

将您的 filter1 函数更改为那个,您就会得到这个。

print(s1['filter'](lambda x: x % 2 == 0))
print(s1['filter']())
print(s1['filter'](lambda x: x>2))

输出:

(2, 4)
(1, 2, 3, 4, 5)
(3, 4, 5)