В Python, когда я запускаю операцию: 1/0, ее поведение по умолчанию генерирует исключение: «ZeroDivisionError: деление с плавающей запятой на ноль»
Как перегрузить это поведение по умолчанию, чтобы я мог получить: 1 / 0 => math.inf
вам, возможно, придется написать свою собственную библиотеку, которая позволит это сделать, может быть не так уж сложно сделать что-то простое, которое видит, когда вы получаете эту ошибку, и вместо этого присваивает этому числу «бесконечность»
Вам нужно определить свой собственный класс и в нем определить как минимум методы __truediv__
(/
) и __floordiv__
(//
). Если вы определите только эти два +
, например, это не сработает (см. ошибку ниже).
import math
class MyFloat:
def __init__(self, val):
self.val = val
def __truediv__(self, other):
if other.val == 0:
return math.inf
return self.val / other.val
def __floordiv__(self, other):
if other.val == 0:
return math.inf
return self.val // other.val
one = MyFloat(1)
zero = MyFloat(0)
print(one / zero)
print(one // zero)
// will throw an error (PyCharm will also pick up on this)
print(one + zero)
Ожидаемый результат
Traceback (most recent call last):
File "/home/tom/Dev/Studium/test/main.py", line 24, in <module>
print(one + zero)
TypeError: unsupported operand type(s) for +: 'MyFloat' and 'MyFloat'
inf
inf
Список этих функций Python особый см. в статье этот сайт.
Это действительно то, что я ищу - большое спасибо!
В этом случае математически
1/0
должен будет бесконечностью. Но каждый язык программирования, который я когда-либо использовал, выдает такую же ошибку, как в данном случае Python. Помните, однако, что вы не можете проверить равенство с помощьюmath.inf
. Даже если он вернетсяmath.inf
, вы не можете сказать что-то вродеresult = 1/0
, а затемif result == math.inf:
.