В этом случае я бы сказал «Явное лучше, чем неявное».
Когда кто-то читает ваш код, он может сделать несколько предположений.Они могут предположить, что «слова» могут быть либо пустым, либо словесным с данными в нем (пропуская случай, когда их нет). В этом случае у них может возникнуть соблазн оптимизировать ваш код.Они могут даже сделать это правильно, если нигде не указано, что вы можете получить значение None.
Если «слова» на самом деле могут быть None, я бы попытался прояснить это:
self.words = words
if words is None:
self.words = {}
Или, возможно, сначала вместо безусловного присваивания.В любом случае, таким способом вы как бы документируете тот факт, что None является ожидаемым значением для «слов».