我对此任务感到困惑。这是问题所在:我需要检查所有ip属于某些域,然后将dict放入具有共享一个IP的域中。所以这是我写的代码:
def check_ip(domain):
ip = socket.gethostbyname(domain)
return ip
def worker_function(input_queue, output_queue):
global list_unvalid, list_valid, ips_domains
while True:
try:
data = input_queue.get_nowait()
except queue.Empty:
break
parts = re.findall('http(s)*://(.+?)/(.+)$', data)
domain = parts[0][1]
print("checking " + domain)
try:
ip = check_ip(domain)
with mylock:
ips_domains[ip].append(domain)
#output_queue.put_nowait(data)
except Exception as e:
print('Exception ' + str(e))
input_queue.task_done()
但我每次都有一个例外“这里有'异常'ip'”。我认为语法有问题,它会将值附加到dict。我究竟做错了什么?谢谢。
答案 0 :(得分:1)
问题出在
ips_domains[ip].append(domain)
由于ips_domains
是一个空字典,ips_domains[ip]
不是列表对象,您无法在其上调用.append()
。如果您在需要将dict条目初始化为空列表之前没有看到过ip:
if not ip in ips_domains:
ips_domains[ip]=[]
ips_domains[ip].append(domain)
答案 1 :(得分:1)
第一次尝试将域添加到ip时,没有可以添加域的列表。对于每个ip,您必须首先初始化一个空列表。
如果您将dict更改为ips_domains = defaultdict(list)
,则第一次尝试将域添加到ip时会在字典中添加一个空列表。
https://docs.python.org/2/library/collections.html#collections.defaultdict
例如:
>>> a=dict()
>>> a["key"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'key'
>>> from collections import defaultdict
>>> b=defaultdict(list)
>>> b["key"]
[]
>>> b
defaultdict(<class 'list'>, {'key': []})
>>>