Python 长语句的可读性

Python readibility of long statement

我调用了一个 returns 很多元素的函数,尊重 PEP8 的方法是执行以下操作,但我觉得它的可读性不强:

colonne_dernier_attribut, colonne_non_explained_beads, colonne_non_explained_beads_recipient, \
    colonne_non_explained_beads_donor, colonne_score, colonne_comments, colonne_loci_manquants, \
    colonne_edta, colonne_temps, colonne_summary = \
    formatageRes(ws, wrsep, wdsep, feuille, feuille_corrigee, all_epitopes_considered, nbr_ep_considered, nrows)

我想要这样的东西,我们可以清楚地看到调用函数的地方。换句话说,我希望看到 = 符号前后的明显区别。

colonne_dernier_attribut, colonne_non_explained_beads, colonne_non_explained_beads_recipient, \
colonne_non_explained_beads_donor, colonne_score, colonne_comments, colonne_loci_manquants, \
colonne_edta, colonne_temps, colonne_summary = \
    formatageRes(ws, wrsep, wdsep, feuille, feuille_corrigee, all_epitopes_considered, nbr_ep_considered, nrows)

但这不符合 PEP8 准则。我正在寻找第三种替代方案,它更具可读性并且遵循 PEP8。

一个方便的技巧是使用 parens 允许您跨行拆分作业而不必转义换行符:

(
    colonne_dernier_attribut,
    colonne_non_explained_beads,
    colonne_non_explained_beads_recipient,
    colonne_non_explained_beads_donor, 
    colonne_score,
    colonne_comments,
    colonne_loci_manquants,
    colonne_edta, 
    colonne_temps,
    colonne_summary
) = formatageRes(
    ws, 
    wrsep, 
    wdsep, 
    feuille, 
    feuille_corrigee, 
    all_epitopes_considered, 
    nbr_ep_considered, 
    nrows
)

这使得分配变量列表结束和函数调用开始的位置变得非常明显。

我建议,如果只是调用这个函数就这么复杂,你可能想重新考虑这个 API 并让它 return 某种对象(也许只是像这样简单的东西dataclassNamedTuple) 而不是需要所有这些解构才能使用的匿名元组。例如:

from dataclasses import dataclass

@dataclass
class Collone:
    dernier_attribut: str
    non_explained_beads: int
    non_explained_beads_recipient: str
    non_explained_beads_donor: str
    score: int
    comments: list[str]
    loci_manquants: tuple[int, int]
    edta: str
    temps: list[int]
    summar: int

def formatageRes(
    ws, 
    wrsep, 
    wdsep, 
    feuille, 
    feuille_corrigee, 
    all_epitopes_considered, 
    nbr_ep_considered, 
    nrows
) -> Collone: ...

这样你就可以做到:

collone = formatageRes(
     ws, 
     wrsep, 
     wdsep, 
     feuille, 
     feuille_corrigee, 
     all_epitopes_considered, 
     nbr_ep_considered, 
     nrows
)

调用代码的其余部分基本相同,但 collone_varname 替换为 collone.varname

我喜欢Black does (you can try it on its playground):

(
    colonne_dernier_attribut,
    colonne_non_explained_beads,
    colonne_non_explained_beads_recipient,
    colonne_non_explained_beads_donor,
    colonne_score,
    colonne_comments,
    colonne_loci_manquants,
    colonne_edta,
    colonne_temps,
    colonne_summary,
) = formatageRes(
    ws,
    wrsep,
    wdsep,
    feuille,
    feuille_corrigee,
    all_epitopes_considered,
    nbr_ep_considered,
    nrows,
)