Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Организовать вылет на проверке / 10 сообщений из 10, страница 1 из 1
19.04.2015, 09:53
    #38939988
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
Добрый день всем
пытаюсь написать класс, любые операции с которым вызывали бы нужно мне исключение

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
class CrazyObj:
    """Crazy object for test circulate call. All operation redefined"""
    def __int__(self):raise circleError #- приведение к int.
    def __float__(self):raise circleError #- приведение к float.
    
    def __add__(self, other):raise circleError
    def __sub__(self, other):raise circleError    
    def __mul__(self, other):raise circleError    
    def __truediv__(self, other):raise circleError    
    def __floordiv__(self, other):raise circleError    
    def __mod__(self, other):raise circleError    
    def __divmod__(self, other):raise circleError    
    def __pow__(self, other):raise circleError    
    def __lshift__(self, other):raise circleError    
    def __rshift__(self, other):raise circleError    
    def __and__(self, other):raise circleError    
    def __xor__(self, other):raise circleError    
    def __or__(self, other):raise circleError    
    
    def __radd__(self, other):raise circleError
    def __rsub__(self, other):raise circleError    
    def __rmul__(self, other):raise circleError    
    def __rtruediv__(self, other):raise circleError    
    def __rfloordiv__(self, other):raise circleError    
    def __rmod__(self, other):raise circleError    
    def __rdivmod__(self, other):raise circleError    
    def __rpow__(self, other):raise circleError    
    def __rlshift__(self, other):raise circleError    
    def __rrshift__(self, other):raise circleError    
    def __rand__(self, other):raise circleError    
    def __rxor__(self, other):raise circleError    
    def __ror__(self, other):raise circleError 
l_o=CrazyObj()
if l_o:
    print "Not ok"



осталось сделать исключении при проверках в if, можно это как-то сделать?
...
Рейтинг: 0 / 0
19.04.2015, 18:10
    #38940156
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
вот блин и с or и and тоже косяк, они в if не вызываются
Код: python
1.
2.
if l_o or False:
    print "Not ok"


печалька :-(
...
Рейтинг: 0 / 0
20.04.2015, 05:52
    #38940257
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
kealon(Ruslan),
что за бред?
...
Рейтинг: 0 / 0
20.04.2015, 06:39
    #38940264
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
FishHook,

кому бред, а кому удобства в численных расчётах - фактически реализация логики с NULL
пока версия такая

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
class CrazyObj:
    """Crazy object for test circlyc call, null values. All operation redefined to raise some exception"""
    def __init__(self, someException):
        self.e=someException
    def __repr__(self):
        return str(self.e)
    def __int__(self):raise self.e #- приведение к int.
    def __float__(self):raise self.e #- приведение к float.
    def __long__(self):raise self.e #- приведение к long.
#    def __bool__(self):raise self.e #- приведение к bool.
    def __index__(self):raise self.e
#    Unary Operators
    def __neg__(self):raise self.e #-
    def __pos__(self):raise self.e  #+
    def __abs__(self):raise self.e #abs
    def __invert__(self):raise self.e #~
    def __complex__(self):raise self.e #complex
#    Binary Operators
    def __add__(self, other):raise self.e
    def __sub__(self, other):raise self.e
    def __mul__(self, other):raise self.e
    def __truediv__(self, other):raise self.e
    def __floordiv__(self, other):raise self.e
    def __mod__(self, other):raise self.e
    def __divmod__(self, other):raise self.e
    def __pow__(self, other):raise self.e
    def __lshift__(self, other):raise self.e
    def __rshift__(self, other):raise self.e
    def __and__(self, other):raise self.e
    def __xor__(self, other):raise self.e
    def __or__(self, other):raise self.e
    
    def __radd__(self, other):raise self.e
    def __rsub__(self, other):raise self.e
    def __rmul__(self, other):raise self.e
    def __rtruediv__(self, other):raise self.e
    def __rfloordiv__(self, other):raise self.e
    def __rmod__(self, other):raise self.e
    def __rdivmod__(self, other):raise self.e
    def __rpow__(self, other):raise self.e
    def __rlshift__(self, other):raise self.e
    def __rrshift__(self, other):raise self.e
    def __rand__(self, other):raise self.e
    def __rxor__(self, other):raise self.e
    def __ror__(self, other):raise self.e
#    Comparison Operators
    def __lt__(self, other):raise self.e   #<
    def __le__(self, other):raise self.e   #<=
    def __eq__(self, other):raise self.e   #==
    def __ne__(self, other):raise self.e   #<>
    def __ge__(self, other):raise self.e   #>=
    def __gt__(self, other):raise self.e   #>

...
Рейтинг: 0 / 0
20.04.2015, 07:15
    #38940278
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
kealon(Ruslan),

Если тебе на самом деле надо то что ты нафантазировал, то наш питонячий подход выглядит так
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class Meta(object):
    def __new__(cls, name, bases, dct):
        for key in dct["specials"]:
            dct["__%s__" % key] = dct["exception"]
        return type(name, bases, dct)


class CrazyObj:
    __metaclass__ = Meta
    specials = ["float", "long", "index"]

    def exception(self):
        raise self.e

    def __init__(self, some_exception):
        self.e = some_exception

l_o = CrazyObj(Exception)
print l_o.__class__.__dict__
...
Рейтинг: 0 / 0
20.04.2015, 07:16
    #38940279
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
Но вопрос о бреде и начале грибного сезона в Нижневартовске остается открытым: что за бред ты несёшь?
Рассказывай популярно, что ты пытаешься сгородить?
...
Рейтинг: 0 / 0
20.04.2015, 07:51
    #38940286
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
FishHook,
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
class Meta(object):
    def __new__(cls, name, bases, dct):
        for key in dct["specials"]:
            dct["__%s__" % key] = dct["exception"]
        return type(name, bases, dct)


class CrazyObj:
    __metaclass__ = Meta
    specials = ["float", "long", "index"]

    def exception(self):
        raise self.e

    def __init__(self, some_exception):
        self.e = some_exception
class MyException(Exception):
    pass
O = CrazyObj(MyException("ddd"))
try:
    if O:  #вот хочу что бы сдесь генерилось исключение (именно моё, которое передавалось CrazyObj при создании)
        print "Not ok"
    a=O*2  # вот здесь я тоже его ожидаю увидеть
except BaseException as e:
    print e.__class__
    print e.message


а пока вывод такой
Код: plaintext
1.
2.
3.
Not ok
<type 'exceptions.TypeError'>  
unsupported operand type(s) for *: 'CrazyObj' and 'int'
...
Рейтинг: 0 / 0
20.04.2015, 07:53
    #38940287
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
забавная темка)
...
Рейтинг: 0 / 0
20.04.2015, 08:02
    #38940290
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
Ну, допустим, так
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class CrazyObj:

    def exception(self):
        raise self.e

    def __init__(self, some_exception):
        self.e = some_exception

    def __getattr__(self, item):
        self.exception()

    def __nonzero__(self):
        return 0

l_o = CrazyObj(Exception)
print bool(l_o)



Но зачем?????????????????????
...
Рейтинг: 0 / 0
20.04.2015, 08:23
    #38940293
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать вылет на проверке
FishHook, то что доктор прописал, большое спасибо :-)
окончательный вариант такой
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class CrazyObj:
    def __init__(self, some_exception):
        self.e = some_exception
    def __getattr__(self, item):
        raise self.e
    def __nonzero__(self):
        raise self.e
class MyException(Exception):
    pass
O = CrazyObj(MyException("ddd"))


проверяем
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
try:
    a=O
    print "Test if"
    if O:
        print "Not ok"
except BaseException as e:
    print e.__class__
    print e.message


Код: plaintext
1.
2.
3.
Test if
<class '__main__.MyException'>
ddd
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
try:
    a=O
    print "Test operation"
    a=O*2
    print "dd"
except BaseException as e:
    print e.__class__
    print e.message


Код: plaintext
1.
2.
Test operation
<class '__main__.MyException'>
ddd

FishHookНо зачем?????????????????????
интерпретатор пишу ленивых вычислений, что бы не заморачивать пользователя с проверкой некорректных значений вот такой объект и нужен
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Организовать вылет на проверке / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]