为什么图像字段访问器的第一次和第二次调用的返回值不同?

2024-05-26 07:45:01 发布

您现在位置:Python中文网/ 问答频道 /正文

BlobWrapper的图像字段的访问器的第一个调用返回None,第二个调用返回BlobWrapper。一些提示?你知道吗

In [1]: id = app.Plone.invokeFactory('Image', 'myimage', title='MyImage')

In [2]: image=app.Plone[id]

In [3]: blobWrapper=image.getBlobWrapper()

In [4]: accessor=blobWrapper.getField('image').getAccessor(blobWrapper)

In [5]: accessor()

In [6]: accessor()
Out[6]: <plone.app.blob.field.BlobWrapper at 0xa35a194>

Tags: in图像imagenoneidapptitleplone
1条回答
网友
1楼 · 发布于 2024-05-26 07:45:01

字段的getAccessor方法将对象作为参数,而不是blobWrapper instance

>>> accessor = image.getField('image').getAccessor(image)
>>> accessor()
<plone.app.blob.field.BlobWrapper object at 0x1050446e0>

检查this github link

security.declarePublic('getAccessor')
def getAccessor(self, instance):
    """Return the accessor method for getting data out of this
    field"""
    if self.accessor:
        return getattr(instance, self.accessor, None)
    return None

更新: 解释为什么访问器的第一个调用是None,而第二个不是。你知道吗

我和他的魔法有关产品。原型. 如果传递BlobWrapper实例而不是ATImage实例,则会发生以下情况:

第一次呼叫: 在某个时候,会调用Archetypes ObjectField的get方法,请参见https://github.com/plone/Products.Archetypes/blob/master/Products/Archetypes/Field.py#L785

它捕获AttributeError(AttributeError: Attribut...'image'),顺便说一句,如果向ContentType添加新字段,通常会发生这种情况,因为BlobWrapper实例没有属性image(ATImage将具有此属性)。你知道吗

然后它初始化BlobWrapper,就像ATImage上的新字段一样。 这会在Blobwrapper实例上保留一些垃圾,这是您不想要的:-) 返回值是None,请参见https://github.com/plone/Products.Archetypes/blob/master/Products/Archetypes/Field.py#L803

第二次呼叫: 因为第一个调用对BlobWrapper实例做了一些修改,所以第二个调用可以工作并返回正确的值。 https://github.com/plone/Products.Archetypes/blob/master/Products/Archetypes/Field.py#L785

从技术上讲,第一个调用初始化BlobWrapper实例上的AnnotationStorage。 你知道吗

> /Users/maethu/.buildout/eggs-cache/Products.Archetypes-1.9.4-py2.7.egg/Products/Archetypes/Storage/annotation.py(62)get()
-> def get(self, name, instance, **kwargs):
(Pdb) l
 57             """Clean up data in set method
 58             """
 59             raise NotImplementedError
 60
 61         security.declarePrivate('get')
 62  ->     def get(self, name, instance, **kwargs):
 63             ann = getAnnotation(instance)
 64             value = ann.getSubkey(self._key, subkey=name, default=_marker)
 65             if value is _marker:
 66                 if self._migrate:
 67                     value = self._migration(name, instance, **kwargs)
(Pdb) name
'image'
(Pdb) instance
<plone.app.blob.field.BlobWrapper object at 0x10d4042a8>
(Pdb) getAnnotation(instance)
{'Archetypes.storage.AnnotationStorage-image': <plone.app.blob.field.BlobWrapper object at 0x10d430a28>}

我真的认为你不应该这样做:-)

如果我弄错了,请纠正。。。很难理解这种原型行为。你知道吗

相关问题 更多 >