проблемой является opensourcing, которым программное обеспечение было бы нет.
у Них нет достойной криптографии, и там был продемонстрирован, и относительно простые способы нарушить их просто путем замены в горячем режиме ROM вносят кабину для голосования или Наличие устройства, которое увеличивает записи в рекордном картридже.
@Mnementh плохая криптография и возможность подкачать микросхему ROM, не имеет никакого отношения к открытому определению источника код? Таким образом, существует точка?
существует только 3 логических причины opensourcing этот код:
Точки 1 и 3 унесены из воды с точки зрения полноценности и "доказательства Ваших подсчетов голосов", потому что у Вас нет обеспечения, что код, который Вы видите/улучшаете, работает на этих устройствах.
Так, чтобы листы только условие 2 являющийся полезным, и поскольку Вы не идете в [1 124] собственный Ваша собственная машина для подсчета голосов и не имеете никакой потребности в одной для чего-то большего чем низких причин или для простого доказательства их уязвимости.
Для большинства случаев все, что это означало бы, - то, что было бы больше информации, публично доступной на , как для нарушения этих машин, таким образом, Вам больше не будет нужен физический доступ к тому для попытки перепроектируют их программное обеспечение и разрабатывают поставившие под угрозу микросхемы ROM для использования в упомянутых устройствах, чрезвычайно уменьшая барьер для доступа для компромисса системы голосования.
Предоставленный, даже в состоянии нес открытым исходным кодом эта информация может все еще просочиться, и у Вас просто есть ложное чувство безопасности, потому что Вы принимаете "тройки никакая утечка, я в безопасности", но наоборот, если Вы открытый исходный код, это, люди примут "сотни людей, посмотрело на исходный код, я в безопасности", который является одинаково плохим ложным чувством безопасности.
Люди ищут серебряную пулю безопасный способ голосовать, и к сожалению, нет ни одного. Не выращивая гонку очищенных народов, кого воспитывается уклончивыми монахами в изоляционистских святынях для имения породы людей просто для задачи наблюдения и подсчета голосов точно, кого обучен быть аморальным и не может быть подкуплен для переключения голосования.
(Это отсортировало бы быть похожим на 'темного ангела' ряд кроме с голосующими агентами вместо убийц, и все мы знаем, как то шоу удается, один из них пошел бы помада, мы будем доверять им, и они завинтили бы нас всех)
Это будет работать. Но это какое-то безумие.
try:
assert False, "A Message"
except AssertionError, e:
raise Exception( e.args )
Почему не следующее? Это менее безумно.
if not someAssertion: raise Exception( "Some Message" )
Это лишь немного сложнее, чем утверждение assert
, но не противоречит нашим ожиданиям, что ошибки assert вызывают AssertionError
.
Учтите это.
def myAssert( condition, action ):
if not condition: raise action
Затем вы можете более или менее заменить существующие утверждения чем-то вроде этого.
myAssert( {{ the original condition }}, MyException( {{ the original message }} ) )
Как только вы это сделаете, теперь вы можете свободно возиться с включением или отключением или чем-то еще, что вы пытаетесь сделать
Также ознакомьтесь с модулем предупреждений . Возможно, это именно то, что вы пытаетесь сделать.
Как насчет этого?
>>> def myraise(e): raise e
...
>>> cond=False
>>> assert cond or myraise(RuntimeError)
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in myraise
RuntimeError
In Python 2.6.3 at least, this will also work:
class MyAssertionError (Exception):
pass
AssertionError = MyAssertionError
assert False, "False"
Traceback (most recent call last):
File "assert.py", line 8, in <module>
assert False, "False"
__main__.MyAssertionError: False
To see if try has any overhead I tried this experiment
here is myassert.py
def myassert(e):
raise e
def f1(): #this is the control for the experiment
cond=True
def f2():
cond=True
try:
assert cond, "Message"
except AssertionError, e:
raise Exception(e.args)
def f3():
cond=True
assert cond or myassert(RuntimeError)
def f4():
cond=True
if __debug__:
raise(RuntimeError)
$ python -O -mtimeit -n100 -r1000 -s'import myassert' 'myassert.f1()'
100 loops, best of 1000: 0.42 usec per loop
$ python -O -mtimeit -n100 -r1000 -s'import myassert' 'myassert.f2()'
100 loops, best of 1000: 0.479 usec per loop
$ python -O -mtimeit -n100 -r1000 -s'import myassert' 'myassert.f3()'
100 loops, best of 1000: 0.42 usec per loop
$ python -O -mtimeit -n100 -r1000 -s'import myassert' 'myassert.f4()'
100 loops, best of 1000: 0.42 usec per loop
Python также пропускает блоки , если __debug __:
при запуске с параметром -o
. Следующий код более подробный, но делает то, что вам нужно, без хаков:
def my_assert(condition, message=None):
if not condition:
raise MyAssertError(message)
if __debug__: my_assert(condition, message)
Вы можете сделать его короче, переместив условие if __debug __:
внутри my_assert ()
, но тогда оно будет вызываться (без каких-либо действий внутри), когда оптимизация включена.
Никогда не используйте утверждение для логики! Только для дополнительных тестовых проверок. Помните, что если Python работает с включенной оптимизацией, утверждения даже не компилируются в байт-код. Если вы делаете это, вы, очевидно, заботитесь о возникшем исключении, а если вас это волнует, то вы в первую очередь неправильно используете утверждения.
You can let a context manager do the conversion for you, inside a with block (which may contain more than one assertion, or more code and function calls or what you want.
from __future__ import with_statement
import contextlib
@contextlib.contextmanager
def myassert(exctype):
try:
yield
except AssertionError, exc:
raise exctype(*exc.args)
with myassert(ValueError):
assert 0, "Zero is bad for you"
See a previous version of this answer for substituting constructed exception objects directly (KeyError("bad key")
), instead of reusing the assertions' argument(s).