Есть ли у питона элегантный способ
справиться с этим?
Чтобы избежать исключений при печати несвязанных имен, самый элегантный способ - не печатать их; второй самый элегантный способ - обеспечить привязку имен, например, связывая их в начале функции (для этой цели популярен заполнитель None
).
Если нет, то как насчет не элегантного пути?
try: print 'b is', b
except NameError: print 'b is not bound'
В сложной функции я бы предпочел
чтобы избежать проверки существования
каждая локальная переменная перед I, для
пример, печатная отладочная информация
о них
Настоятельно рекомендуется также сохранять простые функции (т. Е. не сложными). Как писал Хоар 30 лет назад (в своей лекции Тьюринга «Старая одежда Императора», например, в этом PDF ):
Существует два способа построения
дизайн программного обеспечения: один из способов сделать это
так просто, что, очевидно, нет
недостатки, а другой путь заключается в
сделать это настолько сложным, что есть
нет явных недостатков. Первый
метод гораздо сложнее.
Достижение и поддержание простоты действительно действительно сложно: учитывая, что вам нужно реализовать определенную полную функциональность X, это самый естественный соблазн в мире сделать это через сложное наращивание в несколько сложных классов и функций различных кусочков, «умных» взломов, эпизодов «копировать-и-вставлять-и-редактировать-бит» «кодирования на диске» и т. д. и т. д.
Однако стоит попытаться сохранить свои функции "такими простыми, чтобы их явно не было недостатков". Если функцию трудно полностью выполнить модульное тестирование, она слишком сложна: разбить ее (то есть перестроить) на естественные компоненты, даже если для их обнаружения потребуется работа. (Это на самом деле один из способов, которым сильный акцент на модульном тестировании помогает качеству кода: побуждая вас неуклонно держать весь код в идеальном состоянии для тестирования, он одновременно побуждает вас к упрощению в структура).