дизайн python: почему утверждается утверждение, а не функция?

В Python assert – это утверждение, а не функция. Это было преднамеренное решение? Существуют ли какие-либо преимущества для assert как утверждения (и зарезервированного слова) вместо функции?

Согласно документам , assert expression1, expression2 расширяется до

  • Чтение / запись закрытий на Python
  •  if __debug__: if not expression1: raise AssertionError(expression2) 

    В документах также говорится, что «текущий генератор кода не генерирует код для оператора assert при запросе оптимизации во время компиляции». Не зная подробностей, похоже, для того, чтобы это стало возможным, потребовался специальный случай. Но тогда особый случай можно было бы также использовать для оптимизации вызовов на функцию assert() .

    Если assert были функцией, вы могли бы написать:

     assert(some_long_condition, "explanation") 

    Но поскольку assert является утверждением, кортеж всегда оценивает значение True , и вы получаете

     SyntaxWarning: assertion is always true, perhaps remove parentheses? 

    Правильный способ написать

     assert some_long_condition, \ "explanation" 

    который, возможно, менее симпатичный.

  • python утверждает с круглыми скобками и без них
  • Как проверить, является ли объект списком или кортежем (но не строкой)?
  • Чтение / запись закрытий на Python
  • Каково использование «assert» в Python?
  • 4 Solutions collect form web for “дизайн python: почему утверждается утверждение, а не функция?”

    Существуют ли какие-либо преимущества для утверждения как утверждения (и зарезервированного слова) вместо функции?

    1. Невозможно переназначить функцию пользователя, то есть она может быть эффективно отключена во время компиляции, как отметил @mgilson.
    2. Оценка второго необязательного параметра откладывается до тех пор, пока / если утверждение не сработает. Неловко делать это с функциями и аргументами функции (нужно было бы пропустить лямбду.) Не откладывая оценку второго параметра, возникли бы дополнительные накладные расходы.

    Одна из замечательных вещей о assert в python и других языках (в частности, C) заключается в том, что вы можете удалить их для оптимизации кода, просто добавив правильный #define (необязательно в командной строке с любым компилятором, который я когда-либо использовал) или оптимизацией flags ( -O в python). Если assert стал функцией, эту функцию невозможно было бы добавить в python, поскольку вы не знаете до тех пор, пока не будете уверены, что у вас есть встроенная функция assert или пользовательская функция с тем же именем.


    Также обратите внимание, что в python вызовы функций достаточно дороги. Замена встроенного кода, if __debug__: ... , вероятно, намного эффективнее, чем вызов функции, который может быть значительным, если вы поместите оператор assert в критическую для производительности процедуру.

    Я не эксперт в Python, но считаю, что производительность – одна из самых больших причин.

    если у нас есть функция assert (выражение, объяснение) как функция, если выражение дорого оценивается, даже если мы находимся в режиме без отладки, Python должен оценить оба выражения, чтобы передать его функции assert.

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

    В дополнение к другим ответам (и вроде не по теме) отзыв. Чтобы избежать использования обратных косых черт, вы можете использовать неявное соединение линий внутри скобок. 😉

    Вместо:

     assert some_long_condition, \ "explanation" 

    Вы могли бы написать:

     assert some_long_condition, ( "explanation") 
    Python - лучший язык программирования в мире.