我对编程比较陌生,我想知道我是否以一种好的方式实现了以下代码:
class Gene:
def __init__(self, gene_symbol, gene_id):
self.gene_symbol = gene_symbol
self.gene_id = gene_id
if is_valid_refseq(gene_id):
self.gene_id_type = REFSEQ
elif is_valid_ensembl_gene(gene_id):
self.gene_id_type = ENSEMBL_GENE
elif is_valid_ensembl_transcript(gene_id):
self.gene_id_type = ENSEMBL_TRANSCRIPT
else:
raise InvalidGeneIDError
假设gene_id
和gene_id_type
是字符串。有没有更聪明的方法来压缩if-elif语句(特别是如果我决定添加更多这些条件)?我认为可能存在,但这会使代码的可读性降低吗?在我前进的过程中,我希望开发出良好的编码习惯/风格,并在此过程中发现一些方便的工具/技巧。谢谢你的帮助!
答案 0 :(得分:-1)
您可以使用break
语句添加循环。 else
子句保持完全相同:
# somewhere outside __init__()
checks = [is_valid_refseq, is_valid_ensembl_gene, is_valid_ensembl_transcript]
idtypes = [REFSEQ, ENSEMBL_GENE, ENSEMBL_TRANSCRIPT]
# in __init__()
for check, value in zip(checks, idtypes):
if check(gene_id):
self.gene_id_type = value
break
else:
raise InvalidGeneIDError
您也可以使用单个词典而不是两个列表,但这不能保证检查的顺序。如果只有一个支票可以成功用于任何gene_id
,使用dict会更好:
checks = {REFSEQ: is_valid_refreq, ENSEMBL_GENE: is_valid_ensembl_gene,
ENSEMBL_TRANSCRIPT: is_valid_ensembl_transcript}
for value, check in checks.items():
if check(gene_id):
self.gene_id_type = value
break
else:
raise InvalidGeneIDError