1from objc import _objc 2import sys 3 4__all__ = ['protocolNamed', 'ProtocolError'] 5 6class ProtocolError(_objc.error): 7 __module__ = 'objc' 8 9PROTOCOL_CACHE = {} 10def protocolNamed(name): 11 """ 12 Returns a Protocol object for the named protocol. This is the 13 equivalent of @protocol(name) in Objective-C. 14 Raises objc.ProtocolError when the protocol does not exist. 15 """ 16 if sys.version_info[0] == 2: 17 name = unicode(name) 18 try: 19 return PROTOCOL_CACHE[name] 20 except KeyError: 21 pass 22 for p in _objc.protocolsForProcess(): 23 pname = p.__name__ 24 PROTOCOL_CACHE.setdefault(pname, p) 25 if pname == name: 26 return p 27 for cls in _objc.getClassList(): 28 for p in _objc.protocolsForClass(cls): 29 pname = p.__name__ 30 PROTOCOL_CACHE.setdefault(pname, p) 31 if pname == name: 32 return p 33 raise ProtocolError("protocol %r does not exist" % (name,), name) 34