python socket函数返回字典

时间:2017-07-25 05:14:48

标签: python

import socket
def get_protnumber(prefix):
    return dict( (getattr(socket, a), a)

for a in dir(socket)
    if a.startswith(prefix))
        proto_fam = get_protnumber('AF_')
        types = get_protnumber('SOCK_')
        protocols = get_protnumber('IPPROTO_')


for res in socket.getaddrinfo('www.thapar.edu', 'http'):
    family, socktype, proto, canonname, sockaddr = res


print 'Family        :', proto_fam[family]
print 'Type          :', types[socktype]
print 'Protocol      :', protocols[proto]
print 'Canonical name:', canonname
print 'Socket address:', sockaddr

您好, 我可以用其他功能替换此功能以获得相同的输出吗? 我不理解以下代码:

return dict( (getattr(socket, a), a)
    for a in dir(socket)
      if a.startswith(prefix))

我的意思是这里发生了什么。首先要执行哪部分代码。这些值将如何返回到字典? 如果我这样做:

def get_protnumber('AF_')[2]

它给了我AF_INET.Is 2默认分配给INET还是什么? getattr在这做什么? 感谢

2 个答案:

答案 0 :(得分:0)

dict( (getattr(socket, a), a) for a in dir(socket) if a.startswith(prefix)) 

这被称为“理解”。不可否认,我不确定你的确如此。字典理解?迭代?谁知道。无论如何,你在这里看到的是一堆不同的东西。

getattr(socket, a)是第一个。 socket是一个具有属性的对象,可以像socket.attribute_namegetattr一样访问,它将字符串作为第二个参数,并返回具有该名称的第一个参数的属性值(如果是存在)。

因此getattr(socket, a)socket获取名称为a的属性。 a只是dir函数返回的列表中的字符串,它返回传递给它的对象的属性列表。对象可以是类,类实例或模块。

所以,如果我们有:

class Socket:
  prop1 = 'a'
  prop2 = 'b'

我们做了dir(Socket)我们会得到['prop1', 'prop2']

所以现在我们有一个dict,它将具有套接字的属性(这可以是方法或变量)作为键,名称作为值。

最后一部分只是检查属性的名称是否以提供的前缀开头。

>>> "Joe".startswith("J")
True

首先会发生什么,它首先获取socket模块的所有属性的名称,如果它以给定的前缀开头,那么它将被添加到元组列表((getattr(socket, a), a) for a in ...)然后在最后投到一个字典。

答案 1 :(得分:0)

dict( (getattr(socket, a), a) for a in dir(socket) if a.startswith(prefix))

等于

def _get_protnumber(prefix):                                                        
    prots = {}                                                                      
    attrs = dir(socket)                                                             
    for a in attrs:                                                                 
        if a.startswith(prefix):                                                    
            key = getattr(socket, a)                                                
            prots[key] = a                                                          
    return prots