我经常编写如下代码
try:
self.title = item.title().content.string
except AttributeError, e:
self.title = None
有没有更快的方法来解决这个问题?单行?
答案 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
密度较大,可读性较差,但你确实保存了两个按键!