Python утверждает — улучшенный самоанализ отказа?

Я думаю, что в общем и целом поля уровня класса являются ошибкой в дизайне языка. Я предпочел бы его, если свойства C# имели свой собственный локальный объем:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

, Который позволил бы прекратить использовать поля полностью.

единственное время я когда-либо снабжаю префиксом частное поле подчеркивание, когда свойство требует отдельного поля поддержки. Это - также единственное использование времени I частные поля. (И так как я никогда не использую защищенные, внутренние, или общедоступные поля, это - единственное время, я использую полевой период.), Что касается меня, если переменная должна иметь объем класса, это - свойство класса.

12
задан NullUserException 19 December 2011 в 18:42
поделиться

6 ответов

Вы можете прикрепить сообщение к assert :

assert 6-(3*2), "always fails"

Сообщение также можно создать динамически:

assert x != 0, "x is not equal to zero (%d)" % x

См. assert statement в Дополнительную информацию можно найти в документации по Python.

7
ответ дан 2 December 2019 в 05:28
поделиться

Как сказал @Mark Rushakoff, нос может оценивать неудачные утверждения. Он также работает со стандартным assert .

# test_error_reporting.py
def test():
    a,b,c = 6, 2, 3
    assert a - b*c

Nostests 'help:

$ nosetests --help|grep -B2 assert
  -d, --detailed-errors, --failure-detail
                        Add detail to error output by attempting to evaluate
                        failed asserts [NOSE_DETAILED_ERRORS]

Пример:

$ nosetests -d
F
======================================================================
FAIL: test_error_reporting.test
----------------------------------------------------------------------
Traceback (most recent call last):
  File "..snip../site-packages/nose/case.py", line 183, in runTest
    self.test(*self.arg)
  File "..snip../test_error_reporting.py", line 3, in test
    assert a - b*c
AssertionError:
    6,2,3 = 6, 2, 3
>>  assert 6 - 2*3


----------------------------------------------------------------------
Ran 1 test in 0.089s

FAILED (failures=1)
7
ответ дан 2 December 2019 в 05:28
поделиться

Набор для тестирования носа применяет интроспекцию к утверждениям .

Тем не менее, AFAICT, вы должны вызвать их утверждения, чтобы получить самоанализ:

import nose
def test1():
    nose.tools.assert_equal(6, 5+2)

приводит к

C:\temp\py>C:\Python26\Scripts\nosetests.exe -d test.py
F
======================================================================
FAIL: test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
    self.test(*self.arg)
  File "C:\temp\py\test.py", line 3, in test1
    nose.tools.assert_equal(6, 5+2)
AssertionError: 6 != 7
>>  raise self.failureException, \
          (None or '%r != %r' % (6, 7))

. Обратите внимание на AssertionError там. Когда моя строка была просто assert 6 == 5 + 2 , я бы получил:

C:\temp\py>C:\Python26\Scripts\nosetests.exe -d test.py
F
======================================================================
FAIL: test.test1
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\nose-0.11.1-py2.6.egg\nose\case.py", line
183, in runTest
    self.test(*self.arg)
  File "C:\temp\py\test.py", line 2, in test1
    assert 6 == 5 + 2
AssertionError:
>>  assert 6 == 5 + 2

Кроме того, я не уверен, что их утверждения пропускаются с помощью -O , но это будет очень быстрая проверка.

4
ответ дан 2 December 2019 в 05:28
поделиться

Добавьте сообщение к вашему утверждению, которое будет отображаться, если утверждение не будет выполнено:

$ python -c "assert 6-(3*2), '6-(3*2)'"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError: 6-(3*2)

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

0
ответ дан 2 December 2019 в 05:28
поделиться

Install your of function as sys.excepthook -- see the docs. Your function, if the second argument is AssertionError, can introspect to your heart's contents; in particular, through the third argument, the traceback, it can get the frame and exact spot in which the assert failed, getting the failing exception through the source or bytecode, the value of all relevant variables, etc. Module inspect helps.

Doing it in full generality is quite a piece of work, but depending on what constraints you're willing to accept in how you write your asserts it can be lightened substantially (e.g. restricting them to only local or global variables makes introspection easier than if nonlocal variables of a closure could be involved, and so forth).

10
ответ дан 2 December 2019 в 05:28
поделиться

Похоже, что вы действительно хотите установить точку останова отладчика непосредственно перед assert и сколько угодно проверять из вашего любимого отладчика.

0
ответ дан 2 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: