Я хочу заимствовать некоторые идиомы SQL,
работать как где player.key == значение
и player.keyN = valueN и т. д.
для N количество пройденных kwargs.
Итак, вы в настоящее время внедряете ИЛИ и хотите вместо него реализовать И - это так?
Если так, то all
, предложенный в ответе @ Mark, будет работать - или альтернативно, и эквивалентно, хотя и на более низком уровне абстракции:
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
напрямую).
В любом случае, другой подход с высокой абстракцией, при условии, что вам не нужны ключи ...:
def search(self, **args):
def vals(p):
return dict((k, getattr(p, k, None)) for k in args)
return [p.playerID for p in self.itervalues() if vals(p) == args]
Этот не "закорачивает", но в остальном эквивалентен Марку. Полностью эквивалентный, но довольно лаконичный:
def search(self, **args):
return [p.playerID for p in self.itervalues()
if all(getattr(p, k, None)==args[k] for k in args)]
Если эти фрагменты кода не соответствуют вашим потребностям, и вы можете уточнить, почему именно они не соответствуют (в идеале, примером или тремя! -), я уверен, что их можно настроить для удовлетворения указанных потребностей.