Python中缺少动态查找器和方法

Fed*_*les 5 python google-app-engine web-applications

我正在尝试在Python中实现类似Rails动态查找器(用于webapp/GAE).动态查找器的工作方式如下:

  • 您的人员有一些字段:姓名,年龄和电子邮件.
  • 假设您要查找名为"Robot"的所有用户.

Person类有一个名为"find_by_name"的方法,它接收名称并返回查询结果:

 @classmethod
 def find_by_name(cls, name):
    return Person.gql("WHERE name = :1", name).get()
Run Code Online (Sandbox Code Playgroud)

我不想为每个属性编写类似的方法,而是希望像Ruby的method_missing那样允许我这样做.

到目前为止,我已经看过这两篇博文:http://blog.iffy.us/?p = 43http://www.whatspop.com/blog/2008/08/method-missing-in-python. cfm,但我想听听"最合适"的做法.

Nic*_*son 7

这里真的没有必要使用GQL - 它只是使问题复杂化.这是一个简单的实现:

class FindableModel(db.Model):
  def __getattr__(self, name):
    if not name.startswith("find_by_"):
      raise AttributeError(name)
    field = name[len("find_by_"):]
    return lambda value: self.all().filter(field, value)
Run Code Online (Sandbox Code Playgroud)

请注意,它返回一个Query对象,您可以调用.get(),.find()等; 这是多功能的,但如果你想要,你当然可以让它只返回一个实体.