Как сделать длинный список исключений в Python короче? - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в программировании и пытаюсь справиться с ошибками в моей программе утилизации.Я перебираю список продуктов на 3 веб-сайтах (A, B и C) в поисках названия и цены продукта.Например, я хочу получить такой вывод:

print(productA, priceA, productB, priceB, productC, price C)

Но иногда некоторые продукты не хранят, скажем, цену или название продукта, потому что его, возможно, нет в наличии, или он просто не может его найти и приносит AttributeError.

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

try:
    print(productA, priceA, productB, priceB, productC, price C)

except AttributeError:

   try:        
       print("not available", priceA, productB, priceB, productC, price C)

   except AttributeError:

       try:        
           print(productA, "not available", productB, priceB, productC, price C)

       except AttributeError:

           try:        
               print("not available", "not available", productB, priceB, productC, price C)
...

И так далее для трех продуктов, пытаясь определить, может ли отсутствовать название или цена одного, двух или трех наименований, и вывести ошибку.У меня вопрос, есть ли способ сделать это проще / быстрее или автоматизировать, чтобы код не был таким длинным?Спасибо

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Простой пример реализации словаря и его перебора по

d={'product A':'', 'product B':22, 'product C':33}

for key,value in d.items():
    try:
        print('product:{}, price:{}'.format(key,int(value)))
    except Exception:
        print('price for {} is not available'.format(key))
0 голосов
/ 08 октября 2018

Подумайте об исключении следующих аспектов:

  • название элемента, который вы ищете
  • сайт, который вы ищете (имейте в виду, что вы можете добавить больше сайтов позже!)
  • имя, которое вы найдете на данном сайте (если есть)
  • цена, которую вы найдете на данном сайте (если есть)

Примерно так:

products = [
    "LED flashlight",
    "AAA battery",
    "AA battery"
]

sites = {
    "Amazon" : "http://amazon.com",
    "Ebay" : "http://ebay.com",
    "Monoprice": "http:monoprice.com"
}

def my_search(url, prodname):
    # your site search code here
    # ...
    return (foundname, foundprice)

for product in products:
    for (site, url) in sites.items():
        (name, price) = my_search(url, product)
            try:
                print(name, end=' ')
            except Exception:
                print("not available", end=' ')
            try:
                print(price, end=' ')
            except Exception:
                print("not available", end=' ')
        print()

С небольшими изменениями вы можете легко создать файл HTML или таблицы или CSV, включая заголовки столбцов, которые легко модифицируются для добавления сайтов или продуктов.Обратите внимание, что приведенные выше шаблоны регулярных выражений НЕ являются хорошими примерами регулярных выражений!

Наконец, это плохая идея - ловить Exception для логических целей, потому что тогда вы будете неправильно обрабатывать другие виды ошибок (например, кто-то пытается прервать программуесли он попадет в бесконечный цикл.) Узнайте, какое исключение вы получаете, и поймайте только это исключение.Еще лучше, если ваш метод поиска выдаст «Нет» или «недоступен» для названия продукта или цены, если он их не найдет.

0 голосов
/ 08 октября 2018

Это демонстрация с псевдо-значениями и с использованием ValueError присвоенные мною значения не имеют значения и используются только для поднятия Error, чтобы показать, как это можно сделать с помощью цикла.В вашем коде было бы AttributeError, если вы поместите все свои элементы в список, а затем будете использовать цикл для печати каждого элемента, и тогда вы можете просто напечатать альтернативное сообщение, если обнаружена ошибка.Если вы хотите, чтобы все было в одной строке, вы можете просто добавить end = ' ' в свои операторы печати

productA, priceA, priceB, productC, priceC = '1', '10', 'blah', '10', '100'

lista = [productA, priceA, priceB, productC, priceC]
for i in lista:
    try:
        print(int(i))
    except ValueError:
        print('{} is not available'.format(i))
1
10
blah is not available
10
100
...