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