int
и math.trunc
имеют несколько сходные отношения, как str
и repr
. int
делегирует методу __int__
типа и возвращается к методу __trunc__
, если __int__
не найден. math.trunc
делегирует методу __trunc__
напрямую и не имеет запасного варианта. В отличие от __str__
и __repr__
, которые всегда определены для object
, как int
, так и math.trunc
могут вызывать ошибки из коробки.
Для всех известных мне встроенных типов, __int__
и __trunc__
определены разумно, где это уместно. Тем не менее, вы можете определить свой собственный набор тестовых классов, чтобы увидеть, какие ошибки вы получаете:
class A:
def __int__(self):
return 1
class B:
def __trunc__(self):
return 1
class C(): pass
math.trunc(A())
и math.trunc(C())
будут повышать TypeError: type X doesn't define __trunc__ method
. int(C())
повысит TypeError: int() argument must be a string, a bytes-like object or a number, not 'C'
. Однако, int(A())
, int(B())
и math.trunc(B())
будут успешными.
В конце концов, решение о том, какой метод использовать, является одним из коннотаций. trunc
по сути является математической операцией, аналогичной floor
, в то время как int
- это преобразование общего назначения, и оно успешно выполняется в других случаях.
И не забудьте о operator.index
и методе __index__
.