Key.from_path:App Engine数据存储文档中令人困惑的Python代码

4
在这个页面:https://developers.google.com/appengine/docs/python/datastore/keyclass#Key_from_path 以下是需要翻译的部分:

Key.from_path(kind, id_or_name, parent=none, namespace=None, **kwds) 从一个或多个实体键的祖先路径中构建一个新的 Key 对象。

路径表示实体的父子关系层次结构。路径中的每个实体都由实体的种类和其数字 ID 或其键名表示。完整路径表示出现在路径末尾的实体,其祖先(父级)作为前置实体。

例如,以下调用创建了一种名为“Address”的实体的密钥,其数字 ID 为 9876,其父级是具有命名键“Boris”的“User”实体:

k = Key.from_path('User', 'Boris', 'Address', 9876)

有关路径的更多信息,请参见 Keys and Entity Groups。

该函数调用及其解释在此处并不合理。如果 Address 是“kind”参数,它应该放在第一位吗?ID 9876 应该放在第二位吗?为什么它们是第三和第四个参数?“parent”是第三个参数,为什么这里有两个“parent”参数(kind 'User' 和 name 'Boris'),它们是参数列表中的第一和第二个?

1
根据解释,这个函数的签名似乎并不完全符合顶部的说明。在我看来,它看起来像是Key.from_path(parent_kind, parent, entity_kind, entity)。 - Junuxx
这是一种构建密钥的替代方法,两种方法都是有效的。但您是正确的,那个页面上的文本需要进行更正。 - alex
完全同意 - 这个例子与解释不一致。 - Alexander Marquardt
2个回答

2

根据Gae源代码Key类的from_path静态方法的签名为:

def from_path(*args, **kwds):

接受一个非零偶数个位置参数,格式为(类型、ID或名称,类型、ID或名称,等等)

if not args or len(args) % 2:
  raise datastore_errors.BadArgumentError(
      'A non-zero even number of positional arguments is required '
      '(kind, id or name, kind, id or name, ...); received %s' % repr(args))

如文档所述,完整路径表示在路径中最后出现的实体,其祖先(父级)是前面的实体。
因此,示例似乎是正确的;创建的键是具有父级为 User(key name 为 Boris)的 Address kind 实体的键,该实体具有 id 为 9876。

2

AppEngine中的键是分层的,要获取完整的键,您需要传递所有祖先信息。

在这个例子中,有两种对象类型:User和Address,User是Address的父对象。调用from_path时,首先提供了对象类型为User,其id为Boris(id可以是字符串名称或整数id),该对象有一个类型为Address的子对象,其id为9876。


这个函数调用所指的实体是 ID 为 9876、类型为“地址”吗?那么,“parent”参数有什么用呢?我们在前面的参数中传递了关于它祖先的所有信息,对吗? - perfwill
@perfwill 是的,实体 ID 是 9876,但是没有父参数它是没有意义的。 - Shay Erlichmen
1
@perfwill 所引用实体的完整键名为“User:Boris/Address:9876” - 键名是分层的。如果您已经有一个父键可用,parent参数提供了一种替代指定分层键的方法。 - Nick Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接