Форматировать или упрощать длинное логическое выражение в Python? - PullRequest
1 голос
/ 16 октября 2019

Я ищу несколько идей, чтобы сделать следующую функцию 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. Я хочу, чтобы он мог легко и быстро читать код.

Могут ли Pythonistas среди нас оставить код, как указано выше, и поддерживать длину строки в 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)

Do 2a и 2b сбиваетесь с толку из-за отступов?

или вы бы пошли на более функциональный подход и избегали длинной линии таким образом:

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)

В некоторых случаях это выглядит самым аккуратнымиз всего этого, но я не уверен, что он наиболее читабелен.

Я уже некоторое время смотрю на этот код и задаюсь вопросом, какой использовать (или есть ли у меня идея получше)Я действительно заинтересован в том, как вы расскажете об этой ситуации.

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Если все они дают одинаковый результат без различий в производительности, то это действительно сводится к личным предпочтениям. Для меня первый способ легче читать.

0 голосов
/ 16 октября 2019

Вот что я решил сделать в конце, используя Чистый код принцип «рассказывания истории» в коде. Обратите внимание, что это нарушает правило СУХОЙ (не повторяйся), но по уважительной причине. Я думаю, что это более читабельно, чем мои другие примеры.

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)
...