Как отформатировать утверждение python assert, соответствующее PEP8?

Как отформатировать длинное утверждение assert, соответствующее PEP8? Пожалуйста, не обращайте внимания на надуманную природу моего примера.

def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), 'some_param_name must be an instance of SomeClassName, silly goose!'

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

5 ответов

Решение

Важно помнить, что PEP8 является лишь руководством и даже утверждает, что бывают случаи, когда правила должны быть нарушены.

Но самое главное: знать, когда нужно быть непоследовательным - иногда руководство по стилю просто не применяется.

Имея это в виду, я, вероятно, написал бы это со старым продолжением линии стиля:

def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), \ 
           'some_param_name must be an instance of SomeClassName, silly goose!'

Если это не устраивает вас (или вашего линтера), вы всегда можете сделать:

def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), ( 
           'some_param_name must be an instance of SomeClassName, silly goose!')

или даже:

def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), ( 
           'some_param_name must be an instance of SomeClassName, '
           'silly goose!')
ERR_MESSAGE_01 = '''
Some really long error message
'''

assert condition(a,b), ERR_MESSAGE_01

Вот как я это делаю... и я думаю, что это хорошо..

Стоит отметить, что можно заключить в скобки, но не так, как вы думаете.

assert isinstance(some_param_name, 
                  SomeClassName), ('some_param_name must be an instance of '
                                   'SomeClassName, silly goose!')

Однако я бы не стал утверждать, что это особенно читабельно. В некоторых случаях это может быть правильным вариантом.

Это описано в pep8 в конце раздела " Максимальная длина строки ".

Обратные косые черты иногда могут быть уместны. Например, [...] Другой такой случай - с операторами assert.

Таким образом, рекомендация pep8 состоит в том, чтобы сделать первый пример миллисонов, например:

def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), \ 
           'some_param_name must be an instance of SomeClassName, silly goose!'
def afunc(some_param_name):
    assert (isinstance(some_param_name, SomeClassName)
            ), 'some_param_name must be an instance of SomeClassName, silly goose!'

Это дает вам подразумеваемое продолжение строки из круглых скобок, которое рекомендуется в PEP 8 без нарушения поведения утверждения.

В качестве альтернативы:

def afunc(some_param_name):
    assert isinstance(some_param_name, SomeClassName), (
           'some_param_name must be an instance of SomeClassName, silly goose!')

+1 для def afunc(some_param_name): assert isinstance(some_param_name, SomeClassName), ( 'some_param_name должно быть экземпляром SomeClassName, глупый гусь!')

Другие вопросы по тегам