Skip to main content
 首页 » 编程设计

python之如果嵌套,有什么方法可以改进代码

2025年05月04日16mate10pro

我用嵌套的 if else 写了这段代码,但我觉得它太丑了,想知道是否有任何改进它的方法(或任何更好的方法来完成这个)。

def do_something(self, response): 
    a_url = response.css('a.classA::attr(href)').extract_first() 
    if a_url: 
        a_url = a_url.split('&')[0] 
    else: 
        a_url = response.css('a.classB::attr(href)').extract_first() 
        if a_url: 
            a_url = a_url.split('&')[0] 
        else: 
            logger.error('get no url') 
    if a_url: 
        yield Request( 
            url=a_url, 
            dont_filter=True, 
            callback=self.do_next_thing 
        ) 

主要的问题是我想从响应中提取一个 url/链接,然后拆分它并获取第一个元素。但是 a_url 只存在于两个(或更多)元素之一中。我无法直接进行拆分,因为a_url 可能是NoneType。我想尝试 try except else 但这似乎变得更加复杂。

有更好的解决方案吗?

请您参考如下方法:

我认为你可以这样做:

def do_something(self, response): 
    a_url = ( 
        response.css('a.classA::attr(href)').extract_first() 
        or 
        response.css('a.classB::attr(href)').extract_first() 
    ) 
 
    if not a_url: 
        logger.error('get no url') 
        return # or raise an exception and let the caller do the logging 
 
    yield Request( 
        url=a_url.split('&')[0], 
        dont_filter=True, 
        callback=self.do_next_thing 
    ) 

这使用了 or operator 的短路行为:

The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.

它还使用了“提前返回”技术,即首先处理失败情况,然后可以在任何 if 或 else 之外完成“正常”情况>.