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在这做什么? 感谢
答案 0 :(得分:0)
dict( (getattr(socket, a), a) for a in dir(socket) if a.startswith(prefix))
这被称为“理解”。不可否认,我不确定你的确如此。字典理解?迭代?谁知道。无论如何,你在这里看到的是一堆不同的东西。
getattr(socket, a)
是第一个。 socket
是一个具有属性的对象,可以像socket.attribute_name
或getattr
一样访问,它将字符串作为第二个参数,并返回具有该名称的第一个参数的属性值(如果是存在)。
因此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