appengine数据存储区中的空列表:java vs python

时间:2010-02-22 14:40:16

标签: java python google-app-engine datanucleus

我在AppEngine中有以下java模型类:

public class Xyz ... {
    @Persistent
    private Set<Long> uvw;
}

在Java中使用设置 uvw 保存对象 Xyz 时,我得到一个“ null ”字段(在appengine数据存储区查看器中列出)。 当我尝试在python中加载相同的对象(通过remote_api)时,由以下python模型类定义:

class Xyz(db.Model):
    uvw = db.ListProperty(int)

我收到“ BadValueError:属性uvw是必需的”。

在python中使用空 uvw 列表保存同一类的另一个对象时,数据存储区查看器会打印一个“缺少”字段。

显然空列表存储处理在Java和python之间有所不同,导致“不兼容”的对象。

因此我的问题是:有没有办法:

  • 强制Java将空列表存储为“缺失”字段,
  • 在加载对象时强制Python优雅地接受“null”列表作为空列表?

关于如何处理两种语言的空列表字段的任何其他建议。

感谢您的回答!

4 个答案:

答案 0 :(得分:2)

如果为Python属性指定默认值,它应该可以工作:

uvw = db.ListProperty(int, default=[])

答案 1 :(得分:1)

我使用的是低级别的java api,所以也许我正在做的事情会有所不同。但在将集合类型数据结构保存到数据存储区之前,我将其转换为数据存储区自然处理的内容。这主要包括Strings和ByteArrays。

听起来java应用引擎将空集解释为空值。并且python没有正确读取这个空值。您可以尝试将空集保存为字符串值“空集”。然后进行python检查以查看数据存储区是否包含该字符串值。如果是,它可以分配一个新的空集,如果没有,它可以将该属性作为集读取。

答案 2 :(得分:0)

Java Set行为是因为Java的Collections是引用类型,默认为null。

要实际创建一个空集,请按以下方式声明:

@Persistent
private Set<Long> uvw = new HashSet<Long>();

或在右侧使用Set的其他一些实现。但HashSet是最常用的Set类型。其他有趣的集合类型是两个线程安全集CopyOnWriteArraySetConcurrentSkipListSet;还有订单集类型LinkedHashSet和排序集类型TreeSet

答案 3 :(得分:0)

它可能对您有用

import numpy as np
import matplotlib.pyplot as plt

xlist = np.linspace(-40, 40)
ylist = np.linspace(-40, 40)
X, Y = np.meshgrid(xlist, ylist)
Z = np.sqrt(X ** 2 + Y ** 2 )
plt.figure()
#These are my values for a certain radius 
levels = [15, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 34, 36, 37]
contour = plt.contourf(X, Y, Z, levels)
contour_filled = plt.contourf(X, Y, Z, levels)
plt.colorbar(contour_filled)
plt.show()

它是最简短的评论方式...