Я думаю, что в общем и целом поля уровня класса являются ошибкой в дизайне языка. Я предпочел бы его, если свойства C# имели свой собственный локальный объем:
public int Foo
{
private int foo;
get
{
return foo;
}
set
{
foo = value;
}
}
, Который позволил бы прекратить использовать поля полностью.
единственное время я когда-либо снабжаю префиксом частное поле подчеркивание, когда свойство требует отдельного поля поддержки. Это - также единственное использование времени I частные поля. (И так как я никогда не использую защищенные, внутренние, или общедоступные поля, это - единственное время, я использую полевой период.), Что касается меня, если переменная должна иметь объем класса, это - свойство класса.
Вы можете прикрепить сообщение к assert
:
assert 6-(3*2), "always fails"
Сообщение также можно создать динамически:
assert x != 0, "x is not equal to zero (%d)" % x
См. assert
statement в Дополнительную информацию можно найти в документации по Python.
Как сказал @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)
Набор для тестирования носа применяет интроспекцию к утверждениям .
Тем не менее, 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
, но это будет очень быстрая проверка.
Добавьте сообщение к вашему утверждению, которое будет отображаться, если утверждение не будет выполнено:
$ 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
.
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 assert
s 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).
Похоже, что вы действительно хотите установить точку останова отладчика непосредственно перед assert
и сколько угодно проверять из вашего любимого отладчика.