根据条件表达式分配变量

时间:2015-12-04 22:28:57

标签: python

我对编程比较陌生,我想知道我是否以一种好的方式实现了以下代码:

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_idgene_id_type是字符串。有没有更聪明的方法来压缩if-elif语句(特别是如果我决定添加更多这些条件)?我认为可能存在,但这会使代码的可读性降低吗?在我前进的过程中,我希望开发出良好的编码习惯/风格,并在此过程中发现一些方便的工具/技巧。谢谢你的帮助!

1 个答案:

答案 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