python - 具有相似模式的多个 if 语句
问题描述
我有以下有效的代码,但我正在寻找一种以更pythonic的方式编写它的方法
if item['merchant_1']=='Google' and not item['merchant_1_price']:
yield scrapy.Request(url=item['merchant_1_link'],callback=self.parse_google,meta={'item': item})
elif item['merchant_2']=='Google' and not item['merchant_2_price']:
yield scrapy.Request(url=item['merchant_2_link'],callback=self.parse_google,meta={'item': item})
elif item['merchant_1']=='Amazon' and not item['merchant_1_price']:
yield scrapy.Request(url=item['merchant_1_link'],callback=self.parse_amazon,meta={'item': item})
elif item['merchant_2']=='Amazon' and not item['merchant_2_price']:
yield scrapy.Request(url=item['merchant_2_link'],callback=self.parse_amazon,meta={'item': item})
elif item['merchant_1']=='Ebay' and not item['merchant_1_price']:
yield scrapy.Request(url=item['merchant_1_link'],callback=self.parse_ebay,meta={'item': item})
elif item['merchant_2']=='Ebay' and not item['merchant_2_price']:
yield scrapy.Request(url=item['merchant_2_link'],callback=self.parse_ebay,meta={'item': item})
# another 30 similar elif statements for different sites
def parse_google(self,response):
#code
def parse_amazon(self,response):
#code
def parse_ebay(self,response):
#code
我有两个商家(可能有价格,也可能没有价格),他们肯定会有一个链接,如果他们中的任何一个没有价格,它应该产生他们各自的parse_seller
(亚马逊、谷歌、ebay、...)。我以类似的模式编写了所有解析方法,以便编写更好看的(Pythonic)代码。我正在寻找一种更紧凑的方式来编写这些 if 语句
解决方案
一种方法是使用一个简单的列表。
companies = ["Google", "Amazon", "Ebay"]
for company in companies:
for i in range(1, 3):
if item[f"merchant_{i}"] == company and not item[f"merchant_{i}_price"]:
yield scrapy.Request(url=item[f"merchant_{i}_link"],callback=getattr(self, f"parse_{company.lower()}"),meta={'item': item})
推荐阅读
- latex - 新的 texlive 安装无法编译文件,在许多其他错误中找不到 `article.cls`
- r - ggplot不同的条形组之间的距离
- excel - 将一个 Excel 工作表中的命名范围复制到另一个工作表中的命名范围
- nginx - 从下游代理解析用户 IP
- java - 标准库是 Java 加载/读取和编辑/修改和保存不重新格式化的 html 文件的最佳选择吗?
- sql - 如何优化具有笛卡尔积和子查询的查询?
- json - Moshi 错误:@JsonClass 不能应用于 [class]。不得密封
- android - 我是否为应用程序使用了错误的 adb 权限而不会在后台被杀死?
- asp.net-mvc - ASP.NET Core:根据应用程序 API 版本从 REST API 响应中隐藏 DTO 属性
- azure - 在 Azure Devops 中调用 ARM 模板时出现 Bash 错误