我试图简单地打印出我附加到它们各自列表中的值(端口)。我用TCP和UDP分开。我要传递给_does_port_dict_have_type
的字典看起来像这样{'22': 'TCP', '53': 'UDP', '31337': 'TCP', '80': 'TCP', '515': 'UDP'}
这是我的代码
x = _expected_ports_type_to_dict(ET.parse('scanme.nmap.org.xml'))
TCP_LIST = []
UDP_LIST = []
def _does_port_dict_have_type(port_dict):
for port, typee in port_dict.iteritems():
if (typee is not None) and len(typee) > 0:
if typee == "TCP":
TCP_LIST.append(port)
else:
UDP_LIST.append(port)
else:
pass
return ','.join(UDP_LIST), ','.join(TCP_LIST)
UDP = _does_port_dict_have_type(x)[0]
TCP = _does_port_dict_have_type(x)[1]
def print_value(func):
print func
print_value(UDP)
print_value(TCP)
这是我的输出80,31337,22 515,53,515,53
TCP变量或_does_port_dict_have_type()的[1]位置是始终显示两次的值。我通过UDP_LIST还是TCP_LIST都没有关系。有谁知道为什么会这样吗?
答案 0 :(得分:1)
实际上,您在这里两次调用了该函数:
UDP = _does_port_dict_have_type(x)[0]
TCP = _does_port_dict_have_type(x)[1]
由于该函数返回一个元组,因此无需调用它两次。您可以使用元组拆包,并在单个语句中分配两个返回值,例如:
UDP, TCP = _does_port_dict_have_type(x)
通过理解,您的功能可以大大简化:
def _does_port_dict_have_type(port_dict):
tcp = [k for k,v in port_dict.items() if v == "TCP"]
udp = [k for k,v in port_dict.items() if v == "UDP"]
return ','.join(udp), ','.join(tcp)
在python 2中,看起来您正在使用iteritems
而不是items
def _does_port_dict_have_type(port_dict):
tcp = [k for k,v in port_dict.iteritems() if v == "TCP"]
udp = [k for k,v in port_dict.iteritems() if v == "UDP"]
return ','.join(udp), ','.join(tcp)