首页 > 解决方案 > 从 Python 列表中过滤掉“None”,“str”对象不可调用

问题描述

我的脚本执行 LDAP 搜索:

import ldap
...<initializations>
res = conn.search_s(base, scope_level, filter, attrs)
_logger.debug("LDAP query result: %s", res)

# Filter out the 'None' entries for referrals
filter(lambda x: (isinstance(x,tuple) and x[0] is not None), res)

这个过滤器在这里出错TypeError: 'str' object is not callable

try...except在它周围添加了日志_logger.debug("Result was:%s, Result type: %s", res, type(res)),它确实是一个列表

# Example:
Result was:[('CN=Domain Admins,CN=Users,DC=hiccups,DC=com',
{'sAMAccountName': ['domain admins']}),
(None, ['ldap://sirius.hiccups.com/DC=sirius,DC=hiccups,DC=com']),
(None, ['ldap://ForestDnsZones.hiccups.com/DC=ForestDnsZones,DC=hiccups,DC=com']),
(None, ['ldap://DomainDnsZones.hiccups.com/DC=DomainDnsZones,DC=hiccups,DC=com']),
(None, ['ldap://hiccups.com/CN=Configuration,DC=hiccups,DC=com'])],
Result type: <type 'list'>

如果我在单独的脚本中复制列表并运行相同的过滤器,它会按预期工作。

for构造替换也可以filter正常工作:

result = []
for each in res:
if (isinstance(each, tuple) and each[0] is not None):
    result.append(each)

但我想调试为什么filter失败

标签: pythonexceptiontypeerror

解决方案


正如@101 的评论所建议的,filter在我观察问题的相同方法中,关键字也被用作参数名称。

filter参数是一个字符串,因此TypeError

只需将参数名称更改为ldap_filter即可修复它


推荐阅读