用Python格式化还是简化长布尔表达式?

问题描述 投票:1回答:2

我正在寻找一些想法,以使以下Python函数尽可能地易读。

def pytest_generate_tests(metafunc):
    if 'cvcorpus_docx' in metafunc.fixturenames and 'cvcorpus_expected' in metafunc.fixturenames:
        actual_expected = cv_testcorpus_actual_expected()
        metafunc.parametrize("cvcorpus_docx,cvcorpus_expected", actual_expected)

根据Python样式指南(PEP8),我可以看到许多方法。我正在与一个经验丰富的C#开发人员合作,他没有使用Python的经验,我们正在开发一个小的内部API。我希望他能够轻松快速地阅读代码。

我们中间的Pythonista使用者是否会离开上面的代码,并将行长度保持在98个字符?或使用反斜杠将if换行:

def pytest_generate_tests2a(metafunc):
    if 'cvcorpus_docx' in metafunc.fixturenames and \
          'cvcorpus_expected' in metafunc.fixturenames:
        actual_expected = cv_testcorpus_actual_expected()
        metafunc.parametrize("cvcorpus_docx,cvcorpus_expected", actual_expected)

或者您是否将大的布尔表达式括起来,所以您不需要反斜杠?

def pytest_generate_tests2b(metafunc):
    if ('cvcorpus_docx' in metafunc.fixturenames and
          'cvcorpus_expected' in metafunc.fixturenames):
        actual_expected = cv_testcorpus_actual_expected()
        metafunc.parametrize("cvcorpus_docx,cvcorpus_expected", actual_expected)

2a2b在缩进方面会引起混淆吗?

或者您会寻求一种更具功能性的方法并避免冗长的做法:

def pytest_generate_tests3(metafunc):
    ae_pair = ('cvcorpus_docx', 'cvcorpus_expected')
    if all(ae in metafunc.fixturenames for ae in ae_pair):
        actual_expected = cv_testcorpus_actual_expected()
        metafunc.parametrize(','.join(ae_pair), actual_expected)

在某些方面,这看起来是最整齐的,但我不确定它是最易读的。

我已经看了这段代码一段时间了,不知道该使用哪个(或是否有一个更好的主意我没见过。)我对您如何思考这种情况真的很感兴趣。

python indentation pep8
2个回答
0
投票

[如果他们都给您相同的结果而在性能上没有差异,那么这实际上取决于个人喜好。对我来说,第一种方法更容易阅读。


0
投票

这是我最终决定使用的代码中“讲故事”的Clean Code原则。请注意,它违反了DRY(请勿重复自己)规则,但这是有充分理由的。我认为这比我的其他示例更具可读性。

def pytest_generate_tests(metafunc):
    docx_fixture = 'cvcorpus_docx' in metafunc.fixturenames
    expected_fixture = 'cvcorpus_expected' in metafunc.fixturenames
    if docx_fixture and expected_fixture:
        actual_expected = cv_testcorpus_actual_expected_pairs()
        metafunc.parametrize("cvcorpus_docx,cvcorpus_expected", actual_expected)
© www.soinside.com 2019 - 2024. All rights reserved.