То, чтобы заставлять Python 'утверждать' выдает исключение, которое я выбираю

проблемой является opensourcing, которым программное обеспечение было бы нет.

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

@Mnementh плохая криптография и возможность подкачать микросхему ROM, не имеет никакого отношения к открытому определению источника код? Таким образом, существует точка?

существует только 3 логических причины opensourcing этот код:

  1. Для подвергания исследованию, как голоса считаются, чтобы быть бесспорными его выполнение его право.
  2. Для кого-то, чтобы быть в состоянии изменить тот код для их собственных потребностей.
  3. Для помещения программного обеспечения в общественное достояние, таким образом, общедоступные разработчики могут изменить к лучшему его.

Точки 1 и 3 унесены из воды с точки зрения полноценности и "доказательства Ваших подсчетов голосов", потому что у Вас нет обеспечения, что код, который Вы видите/улучшаете, работает на этих устройствах.

Так, чтобы листы только условие 2 являющийся полезным, и поскольку Вы не идете в [1 124] собственный Ваша собственная машина для подсчета голосов и не имеете никакой потребности в одной для чего-то большего чем низких причин или для простого доказательства их уязвимости.

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

Предоставленный, даже в состоянии нес открытым исходным кодом эта информация может все еще просочиться, и у Вас просто есть ложное чувство безопасности, потому что Вы принимаете "тройки никакая утечка, я в безопасности", но наоборот, если Вы открытый исходный код, это, люди примут "сотни людей, посмотрело на исходный код, я в безопасности", который является одинаково плохим ложным чувством безопасности.

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

(Это отсортировало бы быть похожим на 'темного ангела' ряд кроме с голосующими агентами вместо убийц, и все мы знаем, как то шоу удается, один из них пошел бы помада, мы будем доверять им, и они завинтили бы нас всех)

40
задан Ram Rachum 14 October 2009 в 21:23
поделиться

7 ответов

Это будет работать. Но это какое-то безумие.

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 }} ) )

Как только вы это сделаете, теперь вы можете свободно возиться с включением или отключением или чем-то еще, что вы пытаетесь сделать

Также ознакомьтесь с модулем предупреждений . Возможно, это именно то, что вы пытаетесь сделать.

53
ответ дан 27 November 2019 в 01:18
поделиться

Как насчет этого?


>>> 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

24
ответ дан 27 November 2019 в 01:18
поделиться

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
3
ответ дан 27 November 2019 в 01:18
поделиться

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
3
ответ дан 27 November 2019 в 01:18
поделиться

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 () , но тогда оно будет вызываться (без каких-либо действий внутри), когда оптимизация включена.

8
ответ дан 27 November 2019 в 01:18
поделиться

Никогда не используйте утверждение для логики! Только для дополнительных тестовых проверок. Помните, что если Python работает с включенной оптимизацией, утверждения даже не компилируются в байт-код. Если вы делаете это, вы, очевидно, заботитесь о возникшем исключении, а если вас это волнует, то вы в первую очередь неправильно используете утверждения.

6
ответ дан 27 November 2019 в 01:18
поделиться

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).

4
ответ дан 27 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

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