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

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

我正在寻找一些想法,以使以下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应用程序中是难闻的气味。

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

python indentation pep8
1个回答
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.