работа со списками в Python - PullRequest
       7

работа со списками в Python

2 голосов
/ 10 апреля 2010

Я пытаюсь внести небольшую модификацию в проект django lfs, которая позволит мне деактивировать продукты без запасов. К сожалению, я только начинаю изучать Python, поэтому у меня большие проблемы с его синтаксисом. Это то, что я пытаюсь сделать. Я использую метод is_variant, возвращающий значение true, если мой продукт является подтипом. Если это вариант, я обращаюсь к родительскому продукту, найдите его активные варианты и проверьте их запасы. Если запас больше 0, переменная активна равна 0, в противном случае она равна 1. Если после циклического просмотра вариантов вариант «активен» все еще равен 1, я устанавливаю активный родительский продукт равным false.

Я как-то не могу заставить его работать должным образом. При использовании:

   def deactivate(self):
        if self.is_variant():
            prod = self.parent
            prod.active = all(var.get_stock_amount() != 0 for var in prod.variants.filter(active=True))
        else:
            prod.active = self.get_stock_amount() != 0

        self.parent.save()

Он деактивирует мой продукт, независимо от того, есть ли у его вариантов запасы или нет. И при использовании:

        inactive = 0
        if self.is_variant():
            prod = self.parent
            for s in prod.variants.filter(active=True):
                if s.get_stock_amount() == 0:
                    inactive = 1
                else:
                    inactive = 0
            if inactive == 1:
                prod.active = 0
            prod.save()
        else:
            if self.get_stock_amount() == 0:
                self.active = 0

            self.save()

То же самое происходит, поэтому мой продукт каждый раз деактивируется.

Я проверил типы возвращаемых данных в shell, а self - это вариант, и он активен.

Ответы [ 3 ]

8 голосов
/ 10 апреля 2010

Во-первых, я бы не назвал список set, потому что это встроенный метод Python (см. set). Используйте append в списке (ваш синтаксис просто неверен, а ошибка, о которой вы получаете, явно говорит вам об этом;)), и вы должны инициализировать список раньше:

def deactivate(self):
"""If there are no stocks, deactivate the product. Used in last step of checkout.
"""
if self.has_variants():
    sets = []
    for s in self.variants.filter(active=True):
        sets.append(s)  
    for var in sets:
        ...

Но зачем создавать список заранее, если единственная цель - повторить его снова? Вы можете просто сделать:

def deactivate(self):
"""If there are no stocks, deactivate the product. Used in last step of checkout.
"""
if self.has_variants():
    for s in self.variants.filter(active=True):   
        if s.get_stock_amount() == 0:
            inactive = True
        else:
            inactive = False
else:
    ...

Подробнее о списках .

2 голосов
/ 11 апреля 2010

Этот код неверен во многих отношениях.

  1. Создание списка с именем set (как отмечено выше)
  2. Установка переменной несколько раз в цикле без чтения
  3. Ненужное возвращаемое значение (если есть только одна точка выхода, как это может быть полезно?)

Я думаю, это сработало бы так же:

def deactivate(self):
    """If there are no stocks, deactivate the product. Used in last step of checkout.
    """
    if self.has_variants():
        inactive = any(var.get_stock_amount() == 0 for var in self.variants.filter(active=True))
    else:
        inactive = self.get_stock_amount() == 0
    self.active = not inactive

или, может быть:

def deactivate(self):
    """If there are no stocks, deactivate the product. Used in last step of checkout.
    """
    if self.has_variants():
        self.active = all(var.get_stock_amount() != 0 for var in self.variants.filter(active=True))
    else:
        self.active = self.get_stock_amount() != 0
0 голосов
/ 29 апреля 2010

Правильное решение. Думаю, есть еще много места для его оптимизации, но сначала мне нужно научиться :):

def deactivate(self):
    """If there are no stocks, deactivate the product. Used in last step of checkout.
    """

    inactive = False

    if self.is_variant():
        prod = self.parent
        inactive = all(var.get_stock_amount() == 0 for var in prod.variants.filter(active=True))
        if inactive:
            prod.active = 0
        prod.save()
    else:
        if self.get_stock_amount() == 0:
            self.active = 0

        self.save()
...