对于以下函数
KEYS = {}
def get(kind):
"returns a new key of a particular kind"
global KEYS
try:
return KEYS[kind].pop(0)
except (KeyError, IndexError):
handmade_key = Key.from_path(kind, 1)
start, end = allocate_ids(handmade_key, 3)
id_range = range(start, end+1)
KEYS[kind] = [Key.from_path(kind, id) for id in id_range]
for key in KEYS[kind]:
print "within get() -> %s:%s"%(key, key.id())
return get(kind)
我编写了以下单元测试
def testget2000(self):
s = set()
for i in range(0, 7):
key = keyfactory.get("Model1")
print "from get() -> %s:%s"%(key, key.id())
s.add(key)
self.assertEqual(len(s), 7)
self.assertEqual(len([k.id for k in s]), 2000)
并出现以下错误
FAIL: testget2000 (keyfactory_test.ModelTest)
Traceback (most recent call last): File "/home/vertegal/work/ei-sc/appengine/keyfactory_test.py",
line 36, in testget2000 self.assertEqual(len(s), 7) AssertionError: AssertionError: 5 != 7
-------------------- >> begin captured stdout <<
from get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAgw:2 from get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAww:3 within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAQw:1 within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAgw:2 within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAww:3 from get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAQw:1 from get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAgw:2 from get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYAww:3 within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBAw:4 within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBQw:5 within get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBgw:6 from get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBAw:4 from get() -> agpkZXZ-cXVpenJ5cgwLEgZNb2RlbDEYBQw:5
我真的不明白为什么第一次要在“within”之前打印“from”。另外,为什么它会两次分配相同的前几个 id?我是否创建了一些奇怪的闭包?异常处理程序中的 KEYS 与外部的对象是否不同?我迷路了。
最佳答案
因此,当您捕获的输出开始时,数据存储区为空,但 KEYS[kind]
有两个值已填充。数据存储不会两次分配相同的 ID,您只是拥有从未分配过的剩余 ID。要么追踪其他写入 KEYS
的内容,或者在测试开始时将其清除。
此外,您似乎正在传递实际的模型类。 Key.from_path
需要一个字符串,例如'Model1'
而不是Model1
.
关于python - 为什么要这样枚举呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7588878/