Python Class, как пропустить неправильную запись и перейти к следующей записи - PullRequest
0 голосов
/ 13 декабря 2018

Я создал этот класс Python для ввода некоторых продуктов, которые могут быть либо новыми, либо использоваться, либо отремонтированы (нечувствительность к регистру достигается функцией .lower()).Любая другая запись параметра условия должна выдавать ошибку (ValueError), и я хочу, чтобы код перешел к следующей строке.

Random_Product_1 - первый и совершенно новый объект.С этим проблем нет.Я сделал преднамеренную ошибку с условием следующего объекта Random_Product_2.Это должно напечатать ValueError.Это делает, но и дополнительные вещи ошибки.Это приводит к тому, что код останавливается на своем пути.Следующая строка кода, создающая объект (введены правильные значения условий), просто не запускается.

В основном я пытаюсь заставить код пропустить ошибочные записи, такие как Random_Product_2, до следующей строки кода.Вот мой основной код, на котором я планирую создавать другие вещи, как только решу эту проблему.

class Product:
    def __init__(self, Id, price, inventory, condition):
        self.condition = condition.lower()
        if self.condition != "new" and self.condition != "used" and self.condition != "refurbished":
            raise ValueError('condition can only be new or used or refurbished')
        self.Id = Id
        self.price = price
        self.inventory = inventory

Random_Product_1 = Product('What_is_this', 50, 81, "Used") # defined perfectly
Random_Product_2 = Product('What_is_this', 50, 85, "Useed") # not defined at all, code doesn't go to next line
Random_Product_3 = Product('What_is_this', 500, 805, "Used") # This is not run

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Если я правильно понимаю, вы решили вызвать исключение, чтобы экземпляр с недопустимым значением вообще не создавался, поэтому вам не придется иметь дело с ним впоследствии.Почему бы и нет.Однако для продолжения работы программы после возникновения исключения необходимо использовать оператор try.Давайте создадим продукты в цикле и используем только один оператор try внутри этого цикла:

class Product:
    def __init__(self, Id, price, inventory, condition):
        self.condition = condition.lower()
        if self.condition not in ("new", "used", "refurbished"):
            raise ValueError('condition can only be new or used or refurbished')
        self.Id = Id
        self.price = price
        self.inventory = inventory

    # special method for a more readable print()
    def __repr__(self):
        return "{}\t{}\t{}\t{}".format(self.Id, self.price, self.inventory, self.condition)

data = (('A', 50, 81, "Used"),
        ('B', 50, 85, "Useed"), 
        ('C', 500, 805, "Used"))

product_list = []

for item in data:
    try:
        new_product = Product(*item)
    except:
        # do nothing with the exception
        pass
    else:
        product_list.append(new_product)

# check if product 'B' exists
for item in product_list:
    print(item)

Вывод:

A   50  81  used
C   500 805 used
0 голосов
/ 13 декабря 2018

Ваше описание проблемы не точное: оператор if не может «перейти к следующей записи», потому что следующая запись контролируется вызывающей программой, а не __init__.Все, что вы можете сделать в инициализаторе, это управлять настройкой этого одного объекта.

Корень проблемы в том, что вы говорите , что хотите, чтобы программа продолжала, но вы использовали языковое средство, которое , в частности, прерывает программу.Очень просто, вам нужно решить, какой из них вы хотите.Предполагая, что вы хотите завершить текущую инициализацию как можно более плавно, попробуйте следующее: проверьте заданный выбор по списку допустимых вариантов.Если его нет в этом списке, введите простое сообщение и завершите инициализацию как можно лучше.

def __init__(self, Id, price, inventory, condition):
    valid_condition = ("new", "used", "refurbished")
    self.condition = condition.lower()
    if self.condition not in valid_condition:
        print('condition can only be new or used or refurbished. ',
              'Setting to "unknown"')
        self.condition = "unknown"

    self.Id = Id
    self.price = price
    self.inventory = inventory

Этого эффекта вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...