Yet Another PEP: Query Protocol Interface or __query__

Delaney, Timothy tdelaney at avaya.com
Wed Mar 21 19:03:44 EST 2001


A couple of definite flaws (one major). Code changed below.

class __requirement:
	""""""
	
	def __init__(self):
		""""""

	def verify (self, adaptor):
		""""""

		#	For now, we will just verify that the object has the
		#	named attribute. Later this can be more complex
		#	(parameters, signatures, etc)

		attr = getattr(adaptor, self.getName(), None)

		if attr:
			return adaptor

		#	Not required, but explicit is better than implicit
;)
		return None

class interface:
	""""""
	
	def __init__(self):
		""""""

	def requirements (self):
		""""""
		#	return sequence of __requirement - requirements are
		#	generated automatically by factory methods in the
		#	interface class
		return ()

	def __adapt__(self, descriptor):
		""""""

		#	For now, only interface and its subclasses will be
		#	directly adapted. Later we will add a verification
		#	process directly here as the requirements() method
		#	should return an empty sequence unless requirements
		#	have been added by subclasses or instances

		if self == descriptor or isinstance(descriptor, interface):
			return self

__interface = interface()

class implements:
	""""""
	
	def __init__(self):
		""""""

	def __query__(self, requirement):
		""""""
		

def adapt(descriptor, object):

	#	Verify that the interface object actually meets
	#	the requirements for the interface descriptor interface

	if descriptor:
		assert adapt(None, descriptor)
	else:
		descriptor = __interface

	adapted = None
	__adapt__ = getattr(object, '__adapt__', None)

	if __adapt__:
		adapted = __adapt__(descriptor)

	if not adapted:

		adapted = object
		__query__ = getattr(object, '__query__', None)
		
		for r in descriptor.requirements():
			
			if __query__:

				query = adaptor.__query__(self)

				if query == None:
					adapted = r.verify(adaptor,
__query__)
				elif not query:
					adapted = None

				if not adapted:
					break

	if adapted:
		return adapted
	else:
		raise AttributeError('Does not implement interface')

if __name__ == '__main__':
	print adapt(None, implements())

Tim Delaney
Avaya Australia
+61 2 9352 9079




More information about the Python-list mailing list