[Twisted-web] A problem with convertToData in nevow.accessors
Russell Duhon
twisted-web@twistedmatrix.com
Thu, 25 Mar 2004 22:11:21 -0600
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I'm starting work on an app and ran into an odd little problem, and
while in general I'd love to hack around on nevow to figure out exactly
where its arising I need to go to sleep now, and would like to be able
to progress on my project come tomorrow.
Basically, I've got a data function that returns a Deferred (from the
adbapi dbpool's runQuery method)-- that seems to get handled just fine
- -- which is used for a sequence rendering. However, in the function
convertToData in accessors.py, an error occurs:
(nevow is just checked out from CVS, twisted is checked out from CVS a
few days ago. I did install Nevow in site-packages, but I don't think
that would be causing this).
2004/03/25 21:57 CST [-] FAILURE ! [Failure instance: Traceback:
exceptions.AttributeError, ListContainer instance has no attribute
'get'
2004/03/25 21:57 CST [-]
/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/
site-packages/twisted/internet/defer.py:338:_runCallbacks
2004/03/25 21:57 CST [-]
/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/
site-packages/nevow/accessors.py:15:convertToData
After educating myself somewhat on interfaces, I changed the code to
help me debug the issue:
def convertToData(data, context):
from twisted.python import log
log.err('data: ' + str(data))
log.err('data type: ' + str(type(data)))
newdata = IGettable(data, persist=False, default=None)
log.err('newdata: ' + str(newdata))
if newdata is not None:
newdata = newdata.get(context)
if isinstance(newdata, Deferred):
return newdata.addCallback(convertToData, context)
else:
return convertToData(newdata, context)
else:
return data
(original function was:
def convertToData(data, context):
newdata = IGettable(data, persist=False, default=None)
if newdata is not None:
newdata = newdata.get(context)
if isinstance(newdata, Deferred):
return newdata.addCallback(convertToData, context)
else:
return convertToData(newdata, context)
else:
return data
)
Well, that produced some semi-mystifying results:
2004/03/25 21:57 CST [-] "data: [['samson and delilah', 'delilah and
frank']]"
2004/03/25 21:57 CST [-] "data type: <type 'list'>"
2004/03/25 21:57 CST [-] 'newdata: <nevow.accessors.ListContainer
instance at 0x111d968>'
2004/03/25 21:57 CST [-] FAILURE ! [Failure instance: Traceback:
exceptions.AttributeError, ListContainer instance has no attribute
'get'
2004/03/25 21:57 CST [-]
/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/
site-packages/twisted/internet/defer.py:338:_runCallbacks
2004/03/25 21:57 CST [-]
/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/
site-packages/nevow/accessors.py:19:convertToData
My guess is that IGettable is in this case supposed to return the None
of the default argument, and thus the list itself be returned, but I'm
not absolutely certain of that, and if that is what's supposed to
happen, I'm in the dark as to why its not happening, and would need to
peruse how Nevow handles interfaces a fair amount more, I think.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (Darwin)
iD8DBQFAY61qFZO4LxR6+NgRAnE5AJ0TrpTFHOqJ/jP2yjAiz8pbpSgg2gCfXYtz
uqLcFj09SklpstYAKdRNZh4=
=yIwf
-----END PGP SIGNATURE-----