第一个函数的第二个返回值是打印两次



我正试图简单地打印出附加到它们各自列表中的值(端口(。我用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。有人知道为什么会发生这种情况吗?

实际上,您在这里调用了两次函数:

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)

最新更新