AFAIU, вы хотите убедиться, что некоторые объекты ведут себя («следуют за интерфейсом») в более раннее время, чем при фактическом использовании. В вашем примере вы хотите знать, что объекты подходят во время создания экземпляра, а не когда они будут фактически использоваться.
Учитывая, что мы здесь говорим на Python, я не буду предлагать assert
(что, если python -O
или переменная окружения PYTHONOPTIMIZE установлена в 1 при запуске вашей программы?) Или проверять определенные типы (поскольку это излишне ограничивает типы, которые вы можете использовать), но я предлагаю раннее тестирование функциональность , что-то вроде:
def __init__(self, a_number, a_boolean, a_duck, a_sequence):
self.a_number= a_number + 0
self.a_boolean= not not a_boolean
try:
a_duck.quack
except AttributeError:
raise TypeError, "can't use it if it doesn't quack"
else:
self.a_duck= a_duck
try:
iter(a_sequence)
except TypeError:
raise TypeError, "expected an iterable sequence"
else:
self.a_sequence= a_sequence
Я использовал try… except… else
в этом предложении, потому что я хочу установить элементы экземпляра только , если тест пройден успешно, даже если код изменен или дополнен. Тебе не обязательно делать это, очевидно.
Что касается аргументов функций и параметров настройки, я бы не стал делать эти тесты заранее, я бы просто использовал предоставленные объекты и действовал на основе исключений, если только подозрительные объекты не будут использоваться после длительного процесса.