Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 寻找另一种避免if语句的方法_Python - Fatal编程技术网

Python 寻找另一种避免if语句的方法

Python 寻找另一种避免if语句的方法,python,Python,我是python语言的新手,我开始使用Scrapy,这很神奇,我想知道是否有任何方法可以减少编写量并避免大量if语句,同时避免代码中的重复: titleText = response.css('title::text').get() if response.status == 200: if len(response.css('title').extract()) == 0: self.data['crawl']['meta']['missing

我是python语言的新手,我开始使用Scrapy,这很神奇,我想知道是否有任何方法可以减少编写量并避免大量if语句,同时避免代码中的重复:

titleText = response.css('title::text').get()

    if response.status == 200:
        if len(response.css('title').extract()) == 0:
            self.data['crawl']['meta']['missingTitle'].append({
                'url': response.url,
                'latency': response.meta.get('download_latency')
            })
        elif len(response.css('title').extract()) == 1:
            if len(titleText) > 70:
                self.data['crawl']['meta']['longTitle'].append({
                    'url': response.url,
                    'text': titleText,
                    'latency': response.meta.get('download_latency')
                })
            elif len(titleText) < 50:
                self.data['crawl']['meta']['shortTitle'].append({
                    'url': response.url,
                    'text': titleText,
                    'latency': response.meta.get('download_latency')
                })
        else:
            self.data['crawl']['meta']['multipleTitleTag'].append({
                'url': response.url,
                'text': titleText,
                'latency': response.meta.get('download_latency')
            })
    elif response.status in self.handle_httpstatus_list:
        self.data['crawl']['blockers']['url'].append({
            'url': response.url,
            'code':response.status,
            'text': titleText,
            'latency': response.meta.get('download_latency')
    })
titleText=response.css('title::text').get()
如果response.status==200:
如果len(response.css('title').extract())==0:
self.data['crawl']['meta']['missingTitle'].追加({
“url”:response.url,
'latency':response.meta.get('download\u latency')
})
elif len(response.css('title').extract())==1:
如果len(titleText)>70:
self.data['crawl']['meta']['longTitle'].append({
“url”:response.url,
“文本”:titleText,
'latency':response.meta.get('download\u latency')
})
elif len(标题文本)<50:
self.data['crawl']['meta']['shortTitle'].追加({
“url”:response.url,
“文本”:titleText,
'latency':response.meta.get('download\u latency')
})
其他:
self.data['crawl']['meta']['multipleTitleTag'].append({
“url”:response.url,
“文本”:titleText,
'latency':response.meta.get('download\u latency')
})
elif response.status在self.handle\u httpstatus\u列表中:
self.data['crawl']['blockers']['url'].append({
“url”:response.url,
“代码”:response.status,
“文本”:titleText,
'latency':response.meta.get('download\u latency')
})

谢谢你

你有很多重复的代码,但是如果你有这样不同的可能性,所有这些都很难删除

一体式功能
titleText=response.css('title::text').get()
数据对象={
“url”:response.url,
'latency':response.meta.get('download\u latency')
}
title=response.css('title').extract()
标记名='missingTitle'#默认值
如果response.status==200:
如果len(title)==0:
标记名='missingTitle'
其他:
dataObj['text']=titleText
如果len(标题)>1:
标记名='MultipleTimeTag'
elif len(标题)=1:
如果len(titleText)>70:
标记名='longTitle'
elif len(标题文本)<50:
标记名='shortTitle'
其他:
#如果头衔在50到70岁之间,真的什么都没做吗?
通过
self.data['crawl']['meta'][标记名].append(dataObj)
elif response.status在self.handle\u httpstatus\u列表中:
dataObj['code']=response.status
dataObj['text']=titleText
self.data['crawl']['meta']['multipleTitleTag'].append(dataObj)
提取到另一个函数的标记名 标题标签功能可以移动到一个助手功能,使事情变得更干净。在这里,标记名选择可以很好地结构化,并且可以提前返回。总之,它可能看起来像这样(相应地调整细节):

def get_tag_name(self、title、titleText):
如果len(title)==0:
返回“缺少标题”
如果len(标题)>1:
返回“multipletitle标签”
如果len(titleText)>70:
返回“longtile”
如果len(titleText)<50:
返回“longtile”
返回“默认值”#???
定义主菜单(自我,响应):
titleText=response.css('title::text').get()
数据对象={
“url”:response.url,
'latency':response.meta.get('download\u latency')
}
标记名='MultipleTimeTag'#默认值
title=response.css('title').extract()
如果response.status==200:
tagName=self.get\u tag\u name(title,titleText)
如果len(title)==0:
dataObj['text']=titleText
elif response.status在self.handle\u httpstatus\u列表中:
dataObj['code']=response.status
dataObj['text']=titleText
self.data['crawl']['meta'][标记名].append(dataObj)
它可能不会短很多,但肯定会消除一些混乱,并有助于以后维护代码
如果你有很多相同级别的IFs,你可以考虑不同的方法。现在这似乎是对的(至少对我来说是这样)。

titleText=response.css('title::text')。get()
metaResponse={'text':titleText,'url':response.url,'httpCode':response.status,'latency':response.meta.get('download_latency')}
如果response.status==200:
如果len(response.css('title').extract())==0:
self.data['crawl']['meta']['missingTitle'].append(元响应)
elif len(response.css('title').extract())==1:
如果len(titleText)>70:
self.data['crawl']['meta']['longTitle'].append(metaResponse)
elif len(标题文本)<40:
self.data['crawl']['meta']['shortTitle'].append(元响应)
其他:
self.data['crawl']['meta']['multipleTitleTag'].append(metaResponse)
elif response.status在self.handle\u httpstatus\u列表中:
self.data['crawl']['blockers']['url'].append(元响应)

每个if语句之间都有相当大的变化。这意味着很难将该代码连接到更小的代码。
titleText = response.css('title::text').get()
dataObj = {
    'url': response.url,
    'latency': response.meta.get('download_latency')
}
title = response.css('title').extract()
tagName = 'missingTitle' #default
if response.status == 200:
    if len(title) == 0:
        tagName = 'missingTitle'
    else:
        dataObj['text'] = titleText
    if len(title) > 1:
        tagName = 'multipleTitleTag'
    elif len(title) ==1:
        if len(titleText) > 70:
            tagName = 'longTitle'
        elif len(titleText) < 50:
            tagName = 'shortTitle'
        else:
            #Really nothing done if title between 50 and 70?
            pass
    self.data['crawl']['meta'][tagName].append(dataObj)
    
elif response.status in self.handle_httpstatus_list:
    dataObj['code'] = response.status
    dataObj['text'] = titleText
    self.data['crawl']['meta']['multipleTitleTag'].append(dataObj)
def get_tag_name(self, title, titleText):
    if len(title) == 0:
        return 'missingTitle'
    if len(title) > 1:
        return 'multipleTitleTag'
    if len(titleText) > 70:
        return 'longTitle'
    if len(titleText) < 50:
        return 'longTitle'
    return 'DEFAULT' #???

def the_main_one(self, response):
    titleText = response.css('title::text').get()
    dataObj = {
        'url': response.url,
        'latency': response.meta.get('download_latency')
    }
    tagName = 'multipleTitleTag' #default
    title = response.css('title').extract()
    if response.status == 200:
        tagName = self.get_tag_name(title, titleText)
        if len(title) == 0:
            dataObj['text'] = titleText
    elif response.status in self.handle_httpstatus_list:
        dataObj['code'] = response.status
        dataObj['text'] = titleText
    self.data['crawl']['meta'][tagName].append(dataObj) 
titleText = response.css('title::text').get()
    metaResponse = {'text':titleText, 'url':response.url, 'httpCode':response.status, 'latency':response.meta.get('download_latency')}

    if response.status == 200:
        if len(response.css('title').extract()) == 0:
            self.data['crawl']['meta']['missingTitle'].append(metaResponse)
        elif len(response.css('title').extract()) == 1:
            if len(titleText) > 70:
                self.data['crawl']['meta']['longTitle'].append(metaResponse)
            elif len(titleText) < 40:
                self.data['crawl']['meta']['shortTitle'].append(metaResponse)
        else:
            self.data['crawl']['meta']['multipleTitleTag'].append(metaResponse)
    elif response.status in self.handle_httpstatus_list:
        self.data['crawl']['blockers']['url'].append(metaResponse)