**对象中的kwargs搜索机制(python)

2024-05-20 15:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

希望能够通过传递关键字参数列表为要使用的对象集合提供搜索接口,如下所示:

playerID = players.search(nameFirst='ichiro', nameLast='suzuki')

在哪里播放器。搜索定义如下:

^{pr2}$

显然上面的代码行不通。我想,借用一些SQL习语,去哪里工作播放器.key==值和播放器.keyN=valueN,以此类推,对于N个传递的kwargs数。在

有什么想法吗?谢谢!在


Tags: 对象代码列表search参数定义关键字播放器
2条回答

您应该能够使用^{}内建函数将其更改为列表理解,如果其参数中的所有元素都为True(或者如果iterable为空),则返回True。像这样的方法应该可以做到:

for playerID, player in self.iteritems():
    if all(getattr(player, key) == value for key, value in args.iteritems()):
         ret.append(player.playerID)

I want to, to borrow some SQL idioms, to work like where player.key == value and player.keyN = valueN, and so on for N number of kwargs passed.

所以,您当前正在实现一个或,并希望实现一个,而不是这样吗?在

如果是这样,那么@Mark的答案中建议的all将起作用,或者可以替代,尽管在较低的抽象级别上是等效的:

def search(self, **args):
  ret = []
  for playerID, player in self.iteritems():
    for key, value in args.iteritems():
      if getattr(player, key) != value: break
    else:
       ret.append(player.playerID)

  return ret

我不太清楚为什么你在iteritems上循环,然后忽略你得到的键(直接附加player.playerID而不是playerID键)。在

不管怎样,另一种高度抽象的方法,假设你不需要密钥…:

^{pr2}$

这一个不“短路”,但在其他方面等同于马克的。完全等效,但相当简洁:

def search(self, **args):
  return [p.playerID for p in self.itervalues()
          if all(getattr(p, k, None)==args[k] for k in args)]

如果这些代码片段不能满足您的需求,那么您可以澄清它们为什么不能满足您的需要(最好用一两个例子!-),我相信他们可以调整,以满足所说的需要。在

相关问题 更多 >