比“更快捷的方式”;试一试;及;除了“其他”?-python

比“更快捷的方式”;试一试;及;除了“其他”?-python,python,beautifulsoup,Python,Beautifulsoup,我经常让人按照如下方式编写代码 try: self.title = item.title().content.string except AttributeError, e: self.title = None 有没有更快的方法来处理这个问题?一行吗?您从item.title()中得到了哪些例外情况?除了(可怕的做法!)之外,最简单的没有告诉我们。如果是AttributeError(例如,项没有标题方法) 可能是您寻求的一条线性(但请注意,性能不会有太大的不同;-) 编辑:由于OP完

我经常让人按照如下方式编写代码

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


有没有更快的方法来处理这个问题?一行吗?

您从
item.title()
中得到了哪些例外情况?除了(可怕的做法!)之外,最简单的
没有告诉我们。如果是AttributeError(例如,
没有
标题
方法)

可能是您寻求的一条线性(但请注意,性能不会有太大的不同;-)

编辑:由于OP完全改变了问题(它最初只是使用
self.title()
,现在使用
self.title().content.string
,并专门捕获
AttributeError
,而不是使用除
之外的裸
),这个答案的前一个版本当然不再适用了。现在正确的答案是:当属性引用链&c越来越长时,尝试一行是一种荒谬的方法(下一次会有多少个,九个?因为它们在第一次编辑时从一跳到三…;-)

而且,由于不知道这条长长的引用链所表达的许多基本操作中的哪一个可能会引起AttributeError,任何优化的尝试也将是盲目的。

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

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

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


在一行中,尽管我只建议在5%的所有用例中使用它

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

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

两行程序怎么样

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

密度更高,可读性更低,但您确实节省了两次按键

假设AttributeError发生在
字符串上:

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

@亚历克斯谢谢!!我更改了问题中的代码,不确定如何调整一行程序。项是一个BeautifulSoup节点。@RadiantHex,一个线性行对长链的属性引用没有帮助。您尝试/排除的问题是什么--没有
标题
方法,结果中没有
内容
属性,结果中没有
字符串
属性
。。。?如果你同时面对多个这样的问题,没有一个班轮是有意义的;如果只有一个,那么该位置的
getattr
以及正确的默认值可能(从微观角度)有所帮助,但不要期望获得可靠的性能提升!非常感谢你!感谢您为答案添加有趣的内容!您要求“更快”和“更少的代码”。你有偏好吗?还是你神奇地想要两者兼而有之。任何代码更少的东西都可能变得更慢。例外情况真的很快。我想他的意思是“打字更快”而不是“运行更快”。@S.Lott是的“打字更快”,很抱歉混淆了
self.title = getattr(item.title().content, 'string', None)