Как объединить несколько условий в одно в питоне?
Работаю с API Vk и хочу упросить код. Так как таких условий у меня может быть 10ки, а заполнять этим весь код не хочется. Есть ли способ сокращения?
Вот код:
def safe_file(posts):
with open('test.csv', 'w', newline='', encoding='utf-8') as file:
title = csv.writer(file, delimiter=';')
title. writerow(['text', 'image', 'url'])
for post in posts:
try:
if post ['id']:
i = post ['id']
else:
i = 'pass'
if post ['text']:
text = post ['text']
else:
text = 'pass'
if post ['attachments'][0]['photo']['sizes'][-1]['url']:
img = post ['attachments'][0]['photo']['sizes'][-1]['url']
else:
img = 'pass'
except:
pass
img = 'pass'
title.writerow((text, i, img))
Мне нужно упростить эту часть кода:
for post in posts:
try:
if post ['id']:
i = post ['id']
else:
i = 'pass'
if post ['text']:
text = post ['text']
else:
text = 'pass'
if post ['attachments'][0]['photo']['sizes'][-1]['url']:
img = post ['attachments'][0]['photo']['sizes'][-1]['url']
else:
img = 'pass'
except:
pass
img = 'pass'
Ответы (3 шт):
Для начала, можно условный оператор
if post ['id']:
i = post ['id']
else:
i = 'pass'
Записать короче с помощью условного выыражения:
i = post['id'] if post['id'] else 'pass'
После этого я бы сделал функцию, выполняющую все три присваивания:
def con_ass(post):
i = post['id'] if post['id'] else 'pass'
text = ...
img = ...
reurn i,text,img
А в программе бы тогда эти присвоения выглядели бы как-то так:
i,text,img = con_ass(post)
Мне кажется - достаточно компактно и обозримо.
Я бы предложил вариант с дефолтом так назовем это
def try_extract_image_url(post):
try:
return post['attachments'][0]['photo']['sizes'][-1]['url']
except (KeyError, IndexError) as e:
return None
for post in posts:
id = post['id'] or 'pass'
text = post['text'] or 'pass'
img = try_extract_image_url(post) or 'pass'
Можно еще над этим поработать и придумать что то получше например заменить 'pass' на что то более специфичное что бы дальше по коду это было проще фильтровать и обрабатывать. Например завести специальный объект для этого.
Исправленный код:
for post in posts:
try:
if post ['id']:
i = post ['id']
elif: post ['text']:
text = post ['text']
elif: post ['attachments'][0]['photo']['sizes'][-1]['url']:
img = post ['attachments'][0]['photo']['sizes'][-1]['url']
else:
img = 'pass'
except:
pass
img = 'pass'