比“尝试”和“除”更快的方式? - Python

时间:2010-03-14 19:43:09

标签: python beautifulsoup

我经常编写如下代码

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

有没有更快的方法来解决这个问题?单行?

6 个答案:

答案 0 :(得分:6)

您从item.title()获得了哪些例外情况?裸露的except(可怕的做法!)并没有告诉我们。如果是属性错误(例如item没有title方法),

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

可能是你寻求的单行(但是表现不会非常不同,请注意; - )。

修改:由于OP完全改变了问题(原来只是使用了self.title(),它现在正在使用self.title().content.string,而是专门捕获AttributeError与使用裸except)相比,此答案的先前版本当然不再适用。现在正确的答案是:尝试单行是一种荒谬的方法,当属性引用链和c持续增长越来越长时(下一次会有多少,9个?因为他们从1跳到3)首先编辑...; - )。

并且不知道那个长的Law of Demeter - 嘲弄引用链表达的许多基本操作中的哪一个可能会引发AttributeError,任何优化尝试都会相当盲目。

答案 1 :(得分:2)

在一行中,虽然我只建议在所有使用案例中占5%。

self.title = item.title().content.string if hasattr(item, 'title') else None

答案 2 :(得分:2)

假设AttributeError发生在string

self.title = getattr(item.title().content, 'string', None)

答案 3 :(得分:0)

  • 您应该提前知道对象是否具有给定属性。当你有一个物体但不知道它是什么时,这是一个不好的迹象。

  • 您在try块中检索三个属性。 try块应包含尽可能少的代码。如果缺少与您想象的不同的属性,您可以让错误无声地传递。

  • getattr允许您使用默认值,但通常不应将其用于此目的。

答案 4 :(得分:0)

您的问题主要集中在此操作的速度上。首先,为什么你认为这个操作很慢?其次,没有更快的方式来访问属性。即使试图通过首先检查属性来避免捕获也可能会更慢,这仅仅是因为检查属性是否存在所需的Python条件。此外,hasattr尝试读取属性,并捕获AttributeError,返回False。因此,检查属性实际上将涉及try / except。

答案 5 :(得分:0)

两班轮怎么样?

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

密度较大,可读性较差,但你确实保存了两个按键!