Ниже приведена ошибка типа для поплавков.
from math import factorial
def divide_factorials(a, b):
return factorial(a) / factorial(b)
>>> divide_factorials(6.1, 5)
*** ValueError: factorial() only accepts integral values
Это прекрасно, пока я не хочу включить оптимизацию.
def divide_factorials(a, b):
if a == b:
return 1
return factorial(a) / factorial(b)
Теперь я потерял свою ошибку TypeError с плавающей запятой, где stop == start.
>>> divide_factorials(3.3, 3.3)
1
Я мог бы вернуть свой TypeError с помощью isinstance, но это требует от меня точного знания того, что будет и не будет работать в факториале (или любой другой функции, которую я мог бы вызывать). Заманчиво сделать что-то вроде
def divide_factorials(a, b):
# duck type first
factorial((a + b) % 1)
if a == b:
return 1
return factorial(a) / factorial(b)
Это кажется более надежным, но менее очевидным. По (я уверен) веским причинам, я не видел этот шаблон раньше. Какая лучшая причина не делать этого?
Я мог бы нарядить его с помощью assert или попробовать / кроме, но
assert factorial((a + b) % 1) is not None
# or
try:
factorial((a + b) % 1)
except TypeError:
raise TypeError
кажется, во всяком случае, немного более загадочным.