TypeError:'bool'对象不能使用filter函数调用

时间:2018-01-12 20:53:17

标签: python python-3.x python-2.7

我试图过滤掉有效的电子邮件地址,但我收到以下错误。

Traceback (most recent call last):

File "C:/Python27/ghhs.py", line 20, in <module>
    valid=list(filter(a,email)) TypeError: 'bool' object is not callable

以下是代码:

def fun(email):
    for i in email:
        if ('@'and'.') in i:
            user,url=i.split('@')
            web,domain=url.split(".")
            if user.replace('-','').replace('_','').isalnum() is False:
                return False
            elif web.isalnum() is False:
                return False
            elif len(domain)>3:
                return False
            else:
                return True
        else:
            return True
if __name__=="__main__":
    n=int(input())
    email=[raw_input() for i in range(n)]
    a=fun(email)
    valid=list(filter(a,email))
    valid.sort()
    print (valid)

1 个答案:

答案 0 :(得分:1)

filter的第一个参数应该是为第二个参数中的每个项调用的函数,但是您首先调用该函数并传入返回值。将过滤器调用更改为以下内容:

valid=list(filter(fun, email))

<强> ETA

正如下面的评论中所指出的,fun还有其他一些问题。从一个,因为传递给filter的函数被调用每个项目,它不应该尝试循环其输入,而只是接受一个电子邮件地址而不是地址列表。

此外,您对地址中字符的初始测试也会被破坏。这样的事情会更好:

def fun(email):
    if ('@' in email) and ('.' in email):
        user, url = i.split('@')
        web, domain = url.split(".")
        if user.replace('-','').replace('_','').isalnum() is False:
           return False
        elif web.isalnum() is False:
            return False
        elif len(domain)>3:
            return False
        else:
           return True

但更好的是,不要重新发明wheel

from validate_email import validate_email

valid = list(filter(validate_email, email))