[Twisted-Python] Components
James Y Knight
foom at fuhm.net
Thu Feb 26 09:58:49 MST 2004
So I want to merge the changes from Nevow that allow lazy adapter
registration via string arguments to registerAdapter:
registerAdapter("nevow.freeform.StringRenderer","nevow.formless.String",
"nevow.freeform.ITypedRenderer")
However, doing this necessarily means the removal of the implicit
super-interface feature, where twisted automatically registers
StringRenderer for all super-interfaces of ITypedRenderer. As there is
no way to look up the super-interfaces of a string at registerAdapter
time (without loading up the module), this feature cannot stay.
I also doubt that's actually used by anyone. I can't think of a reason
why I'd want to do that. The test suite doesn't even test it: all tests
pass after removing it. There is a test for the behavior of the
components.superInterfaces function, but not for actually registering
adapters.
Also, the current behavior is pretty much arbitrary and wrong:
>>>>
from twisted.python.components import *
class IFoo(Interface):
pass
class IBaz(IFoo):
pass
class MyIFooAdapter(Adapter):
pass
class MyIBazAdapter(Adapter):
pass
registerAdapter(MyIBazAdapter, str, IBaz)
registerAdapter(MyIFooAdapter, str, IFoo)
<<<<
Results in:
>>>>
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "twisted/python/components.py", line 214, in registerAdapter
raise ValueError(
ValueError: an adapter (__main__.MyIBazAdapter) was already registered.
<<<<
However,
registerAdapter(MyIFooAdapter, str, IFoo)
registerAdapter(MyIBazAdapter, str, IBaz)
works fine.
Depending on the order of adapter registration seems quite fragile to
me. The only proper way to handle this would be to have a concept of
'depth' ala PyProtocols.
James
More information about the Twisted-Python
mailing list