Это зависит от того, откуда вы берете свои данные и насколько просто вы хотите, чтобы ваш код был. Если вы хотите, чтобы этот класс полностью проверял входные данные, которым вы не можете доверять, например, потому что они поступают непосредственно из пользовательского ввода, тогда вы делаете явную проверку:
class Calc:
def __init__(self, n1, n2):
if not all(isinstance(n, float) for n in (n1, n2)):
raise TypeError('All arguments are required to be floats')
self.n1 = n1
self.n2 = n2
Следующий уровень ниже этого будет отладочные утверждения :
class Calc:
def __init__(self, n1, n2):
assert all(isinstance(n, float) for n in (n1, n2)), 'Float arguments required'
self.n1 = n1
self.n2 = n2
assert
операторы могут быть отключены для повышения производительности , поэтому не следует полагаться на фактическую проверку. Однако, если ваши данные проходят через уровень проверки до этого, и вы обычно ожидаете, что ваши аргументы будут плавающими, то это хорошо и кратко. Это также удваивается как довольно приличное самодокументирование.
Следующим шагом после этого являются аннотации типа :
class Calc:
def __init__(self, n1: float, n2: float):
self.n1 = n1
self.n2 = n2
Это еще более читабельно и самодокументируется, но никогда ничего не делает во время выполнения. Это зависит от stati c type checkers для анализа вашего кода и выявления очевидных ошибок, таких как:
Calc(input(), input())
Такие проблемы могут быть обнаружены и указаны вам stati c проверка типов (поскольку известно, что input
возвращает строки, которые не соответствуют подсказке типа), и они интегрированы в большинство современных сред IDE.
Какая стратегия лучше для вас и вашей ситуации, вы решаете. В коде каждого дня используются различные комбинации всех трех подходов.