如何遍历具有 Nonetype 属性的列表? (Python)

How to iterate through a list with a Nonetype attribute? (Python)

我正在 Python 中制作用于 LAN 主机发现的脚本(没有 scapy 是的,我知道,尝试使用套接字库来获得学习经验)。我能够发现主机,但无法将实时主机与 return 没有响应的主机分开,因为我唯一的指示器是超时响应(ping,它是浮点数或 None ),但我无法迭代 ping,因为它可能是非类型,所以我尝试使用 hasattr 检查主机,但我得到一个空字典。有没有更好的方法可以遍历主机?我可以使主机列表成为字典,但这并不能解决遍历非类型的问题。感谢任何输入,谢谢。

`if __name__ == '__main__':
live = []
livee = []
for host, ping in multi_ping_query(subnet).iteritems():
    subnet = host, '=', ping
    print(subnet)
    live.append(subnet)
for ping in live:
    check = hasattr(ping, 'Nonetype')
    if check == False:
        livee.append(host)
print(livee)

这是 multi_ping_query 的函数,我尝试将它调整为 return 一个字符串,如果它没有连接,但是我也没有成功。

def multi_ping_query(hosts, timeout=1, step=512, ignore_errors=False):
results, host_list, id = {}, [], 0
for host in hosts:
    try:
        host_list.append(socket.gethostbyname(host))
    except socket.gaierror:
        results[host] = None
while host_list:
    sock_list = []
    for ip in host_list[:step]: # select supports only a max of 512
        id += 1
        sock_list.append(PingQuery(ip, id, timeout))
        host_list.remove(ip)
    # use timeout
    asyncore.loop(timeout)
    for sock in sock_list:
        results[sock.get_host()] = sock.get_result()
return results

无需测试您的代码,但如果我理解正确,只需使用 "is None" 再次检查 None 类型:

if ping is not None:
    live.append(host)

通常,您可以通过迭代以下生成器来迭代任何可迭代对象,同时排除 None 值:

>>> iterable = [1, None, 2, 3, None]
>>> iterable_nonone = (x for x in iterable if x is not None)
>>> for x in iterable_nonone:
...     print(x)
... 
1
2
3