当前位置: 首页 > 面试题库 >

在“编译”时不知道属性名称的情况下,使用Python复制Google App Engine数据存储区中的实体

梁丘亦
2023-03-14
问题内容

在我正在编写的Python Google App
Engine应用程序中,我有一个实体存储在数据存储中,需要检索该实体,对其进行精确复制(密钥除外),然后再将该实体放回去。

我应该怎么做?特别是,在执行此操作时是否需要注意任何警告或技巧,以便获得我所期望的那种副本而不是其他东西。

ETA: 嗯,我尝试了一下,但确实遇到了问题。我希望以这样一种方式来制作副本,即在编写代码时不必知道属性的名称。我的想法是这样做:

#theThing = a particular entity we pull from the datastore with model Thing
copyThing = Thing(user = user)
for thingProperty in theThing.properties():
    copyThing.__setattr__(thingProperty[0], thingProperty[1])

这将正确执行,直到我尝试从数据存储中拉出copyThing为止,这时我发现所有属性均设置为None(显然,用户和密钥除外)。显然,这段代码正在做一些事情,因为它将默认值替换为None(所有属性都设置了默认值),但根本没有我想要的。有什么建议吗?


问题答案:

干得好:

def clone_entity(e, **extra_args):
  """Clones an entity, adding or overriding constructor attributes.

  The cloned entity will have exactly the same property values as the original
  entity, except where overridden. By default it will have no parent entity or
  key name, unless supplied.

  Args:
    e: The entity to clone
    extra_args: Keyword arguments to override from the cloned entity and pass
      to the constructor.
  Returns:
    A cloned, possibly modified, copy of entity e.
  """
  klass = e.__class__
  props = dict((k, v.__get__(e, klass)) for k, v in klass.properties().iteritems())
  props.update(extra_args)
  return klass(**props)

用法示例:

b = clone_entity(a)
c = clone_entity(a, key_name='foo')
d = clone_entity(a, parent=a.key().parent())

编辑:如果使用NDB更改

将Gus的以下注释与对指定不同数据存储名称的属性的修复结合起来,以下代码可用于NDB:

def clone_entity(e, **extra_args):
  klass = e.__class__
  props = dict((v._code_name, v.__get__(e, klass)) for v in klass._properties.itervalues() if type(v) is not ndb.ComputedProperty)
  props.update(extra_args)
  return klass(**props)

用法示例(注释在NDB中key_name变为id):

b = clone_entity(a, id='new_id_here')

旁注:请参阅的使用,_code_name以获取Python友好的属性名称。如果没有此属性,则类似的属性name = ndb.StringProperty('n')将导致模型构造函数引发AttributeError: type object 'foo' has no attribute 'n'



 类似资料:
  • 我想知道如何编译。不知道公共类名的java文件。 提供一个示例用例:我正在操作一个沙盒,允许用户向我发送一个字符串。我将该字符串写入。我编译的java文件评估生成的类并回复输出。 ?????.Java语言 如果我随机分配?????。java是一个名称,例如test。java并运行命令javac测试。那么它就会失败 错误:类HelloWorld是公共的,应该在名为HelloW的文件中声明orld.j

  • 如果属性名称仅在运行时已知,如何读取 Kotlin 数据类实例中的属性值?

  • 问题内容: 我有一个电子表格,该电子表格由另一台服务器更新(不受我的控制),我需要自动将数据导入SQL2005。数据始终是电子表格的第一页。但是,该工作表的名称根据行数而变化。 有没有一种方法可以运行SSIS作业,该作业可以从Excel中提取数据而无需事先知道工作表名称?它似乎依赖于工作表名称作为数据源,但是我想告诉它“工作表编号1”或类似的名称。 问题答案: 我可以将工作表名称编写为SSIS用户

  • 这感觉是一个非常愚蠢的问题,但我缺乏JS知识加上缺乏AWS知识让我陷入困境!我只是想掌握基本的AWS堆栈,即Lambda/Dynamo/API网关,以进行一些基本的API工作。 如果我想要一个简单的APIendpoint来处理PUT请求,例如。如果我有一个DynamoDB表,它的复合主键是和,我可以使用下面的代码片段来获取未知数据(设置模式时未知的属性),但这显然效果不佳 我可以使用以下 JSON

  • 我正在使用redux saga。执行分派时,会执行likePost和addPost等函数。 然后每次我使用异步存储。获取令牌的getItem。换句话说,它是重叠的 因为我必须使用jwt令牌 我需要不断传递这样的头到api。这也是重叠 这个怎么用没有冗余,或者说怎么用最方便? 这是我的密码 (saga/post.js) (佐贺/index.js)

  • 我使用Spring Data Neo4J 5.0.10与Spring Boot 2.0.5。节点I具有以下2个实体,用户兴趣实体和用户兴趣实体的关系。 这很有效。我可以创建一个新用户并将该用户与userInterest关联。当我再次发送相同的详细信息时,节点和边不会重复。 当我在关系实体中启用权重属性时,即使权重属性值相同,关系似乎也是重复的。 我记得我读到过,只要属性相同,就不应该创建另一种关系