【问题标题】:Key.from_path: confusing python code in app engine datastore docsKey.from_path:应用引擎数据存储文档中令人困惑的 python 代码
【发布时间】:2012-05-20 13:09:13
【问题描述】:

在本页: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 或它的键名。完整路径表示路径中最后出现的实体,其祖先(父级)作为前面的实体。

例如,以下调用会为数字 ID 9876 的 Address 类型实体创建一个键,其父级是 User 类型的实体,命名键为“Boris”:

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

有关路径的详细信息,请参阅键和实体组。

函数调用和解释在这里没有意义,如果 Address 是“kind”参数,它应该先行吗? ID 9876 应该排在第二位吗?为什么他们是第三和第四?
而“parent”是第三个参数,为什么这里有两个“parent”参数(kind 'User'和name 'Boris'),并且它们在参数列表中的第一个和第二个?

【问题讨论】:

  • 根据解释在我看来 Key.from_path(parent_kind, parent, entity_kind, entity) 似乎与顶部的函数签名不匹配..
  • 这是另一种构造密钥的方法,两者都有效。但您说得对,因为该页面上的文字需要更正。
  • 完全同意——示例与解释不一致。

标签: python google-app-engine


【解决方案1】:

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

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

【讨论】:

  • 所以这个函数调用所指的实体是 id 9876 类型的“地址”?那么“parent”参数是干什么用的,我们在前面的参数中传递了所有关于它的祖先的东西,对吧?
  • @perfwill 是的,实体 id 是 9876,但没有 parent 参数它没有意义。
  • @perfwill 被引用实体的完整键是“User:Boris/Address:9876” - 键是分层的。 parent 参数提供了另一种指定层次键的方法,如果您已经有一个父键可以使用。
【解决方案2】:

Gae source code来看,Key类的from_path静态方法的签名是:

def from_path(*args, **kwds):

(kind, id or name, kind, id or name, etc. etc.) 的形式接受非零偶数个位置参数:

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))

如文档中所述,完整路径表示路径中最后出现的实体,其祖先(父级)作为前面的实体。

所以这个例子似乎是正确的;创建的密钥是 kind 地址的 entity 的密钥,id 9876 的父级为 kind 用户,“Boris”为 @ 987654328@.

【讨论】:

    猜你喜欢
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多