LINUX.ORG.RU

[python] упростить конструкцию

 


0

0

Всем привет :).
Можно ли упростить такой код:
part_found = False
for part in msg.walk()
    if (part.get_content_maintype() == 'application'):
    part_found = True
    break
if not part_found: exit_on_err("attachment not found")


Я пока только вот до такого додумался:
try:
    part = [part for part in msg.walk() if (part.get_content_maintype() == 'application')][0]
except IndexError:
    exit_on_err("attachment not found")


Есть ли способ решить задачу проще?
★★★★★

desired_type = "application"
applic_parts = filter(lambda p: desired_type == p.get_content_maintype(), msg.walk())

if not applic_parts:
    exit_on_err("attachment not found")

kondor ★★★
()

Лучше не используй функциональный подход Кондора, его не рекомендует сам BDFL.

Питоновский подход такой:

for part in msg.walk():
    if part.get_content_maintype() == 'application':
        break
else:
    exit_on_err("attachment not found")

Не ставь лишние скобки вокруг if (читать PEP8 до просветления).
Также читать официальные доки по поводу конструкций языка:

http://docs.python.org/ref/for.html
http://docs.python.org/tut/node6.html#SECTION006400000000000000000

anonymous
()
Ответ на: комментарий от kondor

kondor,спасибо, а какой способ принято использовать в публичном коде?

Тут есть нюанс. Мне на самом деле нужно или найти аттачмент или вывести сообщение что его нет. А просто проверить есть ли он можно и так:

if not filter(lambda p: p.get_content_maintype() == "application", msg.walk()): print "no attachment"

Читабельность, правда, плохая.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Лучше послушай анонимуса выше — он общепринятый способ написал.

sintesis
()
Ответ на: комментарий от anonymous

спасибо, я и забыл что такое есть.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от anonymous

а вот про скобки вокруг if в pep8 ни слова.

true_admin ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.