как получить все элементы выражения генератора, которое я написал? - PullRequest
0 голосов
/ 11 мая 2010

Я использую веб-приложение google-app-engine, часть кода:

class Post(db.Model):
    title = db.StringProperty(required=True)
    def categories(self):
        return (x.category for x in self.postcategory_set)

class Category(db.Model):
    name = db.StringProperty()

class PostCategory(db.Model):
    post = db.ReferenceProperty(Post)
    category = db.ReferenceProperty(Category)


class sss(webapp.RequestHandler):
  def get(self):
    obj1 = Post(title='hhaa')
    #obj1.title = 'haha'
    obj1.put()

    obj2 = Category()

    obj2.name='haha-kao'

    obj2.put()
    obj3=PostCategory()
    obj3.post=obj1
    obj3.category=obj2
    obj3.put()
    self.response.out.write(obj1.categories().get().name)

но я получаю ошибку:

Traceback (most recent call last):
  File "D:\Program Files\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 511, in __call__
    handler.get(*groups)
  File "D:\zjm_code\helloworld\a.py", line 131, in get
    self.response.out.write(obj1.categories().get().name)
AttributeError: 'generator' object has no attribute 'get'

так, как я могу получить все значения гена xp, который я написал?

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Если вам нужен метод all, вы должны вернуть понимание списка вместо генератора:

return [x.category for x in self.postcategory_set]

но так как postcategory_set уже итеративен (потому что вы повторяли его)

return self.postcategory_set

было бы более естественным, но это дало бы вызывающей стороне ссылку на ваши личные изменяемые данные, за исключением того, что в этом случае Post.postcategory_set - это на самом деле не set тип , а скорее экземпляр google.app.engine.ext.db.Query, который действительно повторяемый, но не изменяемый.

И вы не спрашивали, но ваша модель забавная, с таблицей PostCategory, которая может быть ненужной, когда вы могли бы иметь:

class Post(db.Model):
    title = db.StringProperty(required=True)
    category = db.ReferenceProperty(Category)
    def categories(self):
        return list(self.postcategory_set)

И падение PostCategory полностью.

1 голос
/ 11 мая 2010

Это categories().next(), что вам нужно. Генераторы не имеют get.

...