Рубрики
Без рубрики

🐍 Остерегайтесь Python dict.get ()

Если вы думаете, что.get (‘my_key’, ‘default_value’) эквивалентен .ge … Tagged с Python, Tips, Beginters, WebDev.

Кончики Python (серия 3 деталей)

Если вы думаете, что value.get ('my_key', 'default_value') эквивалентен к value.get ('my_key') или 'default_value' Вы, вероятно, должны прочитать это 😃. Если вы знаете, почему это не то же самое, то вы, вероятно, не узнаете что -то здесь.

Хорошая вещь:

Как должен знать любой, кто использует Python 3, DICT API очень ясен и прост. Я могу объявить такого дикта:

my_car = {'wheels': 4, 'brand': 'Tesla'}

Это просто, быстро и просто. Получить ценности так же просто:

my_car.get('brand')
>'Tesla'
my_car['brand']
>'Tesla'

Но чтобы получить значения, я предпочитаю. () по двум причинам. Во -первых, не будет никаких исключений, если ключ, к которому вы хотите получить доступ (он вернется Нет ) Во -вторых, вы можете передать значение по умолчанию методу, который будет возвращен, если ключ не присутствует в DICT:

my_car['color']
>KeyError: 'color'

my_car.get('color')
>

my_car.get('color', 'black')
>'black'

И сложно:

Теперь я собираюсь показать вам, что случилось в реальном мире, исправляя ошибку для Shoptolist В методе, который я написал, который использует lib Это извлекает метаданные со страницы HTML (в этом случае страница электронной коммерции).

Чтобы сделать все короткие, данные, которые я ожидал, должны выглядеть так (упрощенный пример):

data_from_extruct = {    
    'title': 't-shirt',    
    'brand': 'french-rocket',    
    'color': 'green',    
    'offer': {        
          'amount': 20,        
          'currency': '€'
    }
}

Самый простой способ получить цену из этих данных – это:

    price_from_extruct = data_from_extruct['offer']['amount']
    > 20

Но, как я уже говорил, это решение совсем не надежно. Это реальный мир, и в реальном мире данные из экстракта не всегда будут поставляться с предложением и ценой в этом предложении. Лучший способ сделать это – использовать dict.get:

price_from_extruct = data_from_extruct.get('offer').get('amount')

Это до сих пор недостаточно, потому что, если в данных нет предложения, вы попытаетесь выполнить второе .get (‘sumber’) на Нет и это вынесет ошибку. Способ этого избежать: сделать:

price_from_extruct = data_from_extruct.get('offer',{}).get('amount')

Здесь, если у нас нет предложений в данных, первая get вернется {} (пустой дикт) вместо Нет , а затем второй Get будет выступать против пустого дикта и вернется Нет Анкет Все здорово, кажется, что у нас есть надежный способ извлечь цену из данных, которые не постоянно отформатированы. Конечно, иногда это значение будет не менее чем, кроме, по крайней мере, этот код никогда не должен сломаться.

Ну, мы ошибаемся. Уловка происходит от поведения параметра по умолчанию. Помните, что значение по умолчанию будет возвращено, если и только если, ключ – отсутствующий от дикта.

Это означает, что если полученные вами данные выглядят так:

data_from_extruct = {    
    'title': 't-shirt',    
    'brand': 'french-rocket',    
    'color': 'green',    
    'offer': None
}

Тогда предыдущий фрагмент сломается:

price_from_extruct = data_from_extruct.get('offer',{}).get('amount')
> AttributeError: 'NoneType' object has no attribute 'get'

Здесь значение по умолчанию get (‘предложение’, {}) не было возвращено, потому что ключевое предложение было в DICT. Это было просто не подходит.

Конечно, Python потрясающий, поэтому есть много простого способа исправить это. Следующий фрагмент – только один из них:

offers_from_extruct = data_from_extruct.get('offer') or {}
price_from_extruct = offers_from_extruct.get('amount')

Конечно, это также может сломаться, если содержание предложения является списком, например. Но ради примера мы остановимся здесь.

Спасибо за чтение

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

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

Если вам нравится JS, я только что опубликовал что -то, что вам может понравиться.

И если вы предпочитаете git, я вас покрыл.

Кончики Python (серия 3 деталей)

Оригинал: “https://dev.to/daolf/beware-of-python-dictget-194k”