Быстрее, чем «попробовать» и «кроме»? - питон - PullRequest
3 голосов
/ 14 марта 2010

У меня часто код написан следующим образом

try:
  self.title = item.title().content.string
except AttributeError, e:
  self.title = None

Есть ли более быстрый способ справиться с этим?однострочник?

Ответы [ 6 ]

6 голосов
/ 14 марта 2010

Какие исключения вы получаете от item.title()? Голая except (ужасная практика!) Не говорит нам. Если это ошибка AttributeError (где, например, item не имеет метода title),

self.title = getattr(item, 'title', lambda: None)()

может быть одной строкой, которую вы ищете (но производительность не будет чрезвычайно другой, обратите внимание; -).

Редактировать : так как ОП полностью изменил вопрос (первоначально он просто использовал self.title(), теперь он использует self.title().content.string, и он специально перехватывает AttributeError, а не голый except ), предыдущая версия этого ответа, конечно, больше не применяется. Правильный ответ теперь таков: попытка однострочника - абсурдный подход, когда цепочка ссылок на атрибуты & c продолжает расти все дольше (сколько их будет в следующий раз, девять? Поскольку они прыгнули с одного на три при первом редактировании ...; -.)

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

2 голосов
/ 16 марта 2010

Предполагается, что ошибка AttributeError происходит в string:

self.title = getattr(item.title().content, 'string', None)
2 голосов
/ 14 марта 2010

В одной строке, хотя я бы рекомендовал это только в 5% всех случаев использования.

self.title = item.title().content.string if hasattr(item, 'title') else None
0 голосов
/ 16 марта 2010

Как насчет двухслойного?

try: self.title = item.title().content.string
except AttributeError, e: self.title = None

Более плотный, менее читаемый, но вы действительно экономите два нажатия клавиш!

0 голосов
/ 15 марта 2010

Ваш вопрос касается скорости этой операции. Во-первых, почему вы думаете, что эта операция медленная? Во-вторых, нет более быстрого способа доступа к атрибутам. Даже попытка избежать перехвата путем проверки атрибута вначале, вероятно, будет медленнее, просто из-за условий Python, необходимых для проверки существования атрибута. Также hasattr пытается прочитать атрибут и перехватывает AttributeError, возвращая False. Таким образом, проверка атрибута на самом деле будет включать в себя попытку / исключение.

0 голосов
/ 14 марта 2010
  • Вы должны заранее знать, имеет ли объект данный атрибут. Это плохой знак, когда у вас есть объект, но вы не знаете, что это такое.

  • Вы получаете три атрибута в вашем блоке try. Блок try должен содержать как можно меньше кода. Вы можете позволить ошибке пройти молча, если отсутствует другой атрибут, чем вы думаете.

  • getattr позволяет использовать значение по умолчанию, но обычно его не следует использовать для этой цели.

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