Шаблон Django и местные жители обманывают

Книги django дают локальный прием, чтобы не вводить длинный список параметров как словарь контекста

http://www.djangobook.com/en/2.0/chapter04/

Пример:

def current_datetime(request):
    dt_now = datetime.datetime.now()
    return render_to_response('current.html', {'dt_now': dt_now})

становится:

def current_datetime(request):
    dt_now = datetime.datetime.now()
    return render_to_response('current.html', locals())

Это рекомендует это ленивым программистам, но указывает на немного служебные, который может оказать влияние на производительность.

Я хотел бы знать, используют ли некоторые из Вас прием местных жителей на реальных приложениях. Вы рекомендуете это, или действительно ли это - плохая практика?

53
задан mit 5 October 2019 в 01:23
поделиться

5 ответов

Я не люблю повторения - я думаю, что «СУХОЙ», «Не повторяйся» - ключевой принцип программирования. Как следствие, я действительно использовал locals () в аналогичных ситуациях. Отрисовка шаблонов Django - далеко не единственная ситуация такого рода: общий случай - это «функция или оператор, которые принимают dict, но не возражают, если dict содержит лишние записи». (Например, обычное форматирование строк в Python является другим таким случаем.)

Однако существует противодействующий принцип: программы должны быть понятными в максимально локализованном виде, что помогает поддерживать и проводить рефакторинг (поскольку устраняет необходимость в изучите другие файлы, чтобы проверить, какие рефакторинги допустимы). Это говорит о том, что для случая locals () это ' s Хорошо, если шаблон (или строковый формат и т. д.) является локальным литералом (редкий случай, когда, вероятно, используется только несколько переменных и, таким образом, locals () не является большим выигрышем! -), но проблематично в обычном случае, когда шаблон находится в другом файле.

Таким образом, использование locals () в большинстве случаев серьезно затрудняет рефакторинг. Почти в любой ситуации в Python локальные переменные и их имена могут быть свободно изменены как часть локального рефакторинга, поскольку они не имеют «видимого извне» эффекта ... но использование locals () нарушает это - внезапно вы не можете безопасно переименовать переменную в другое имя, предлагающее лучшую ясность, рефакторинг потока кода таким образом, который устраняет необходимость в переменной и т. д. и т. д. без того, чтобы каждый раз изучать отдельный файл шаблона, чтобы проверить, может ли старое имя не понадобиться (и, возможно, редактировать файл шаблона, что может быть нетривиальным, например, если он поддерживается на нескольких разных естественных языках для целей i18n / L10n

Как следствие, в дополнение к второстепенной проблеме производительности, существует сильное давление против , использующего locals () в «серьезном», «производственном» коде - код, который действительно требует длительного обслуживания и, следовательно, легкого рефакторинга и локализации. Поэтому, когда я «программирую как умею», а не «срезая углы», я понимаю, что мне лучше избегать locals () .

Значения, которые вы хотите иметь в контексте, в котором отображается шаблон, не обязательно " аспекты, в которых команде программирования можно было бы хорошо посоветовать принять единое для команды руководство по стилю и придерживаться его - по крайней мере, это устраняет необходимость принимать решение снова и снова каждый раз, когда возникает проблема, и создает более однородный (и тем самым ремонтопригодный) кодовая база. [[Должен признаться, что этот конкретный момент никогда не рассматривался явно в руководящих принципах стиля команд, в которых я участвовал, хотя многие другие сделали это! -)]]

78
ответ дан 7 November 2019 в 08:29
поделиться

Лично мне это не нравится. Вероятно, нет никаких причин для моего предпочтения, кроме старого изречения Python «Явное лучше, чем неявное». Мне нравится точно знать, что входит в мои шаблоны.

12
ответ дан 7 November 2019 в 08:29
поделиться

Я использовал его без проблем (пока!).

Я не особенно люблю печатать, поэтому мне он нравится. Код вроде

'customer' : customer,
'invoice' : invoice,
'date' : date

мне просто кажется смешным, и если я смогу его избежать, то сделаю это. Одна из причин, по которой мне нравится Python, - это отсутствие шаблона (хотя на самом деле это не шаблон, но он похож).

3
ответ дан 7 November 2019 в 08:29
поделиться

Я думаю, это зависит от того, сколько локальных переменных вы определяете в своей функции.

Если он точно соответствует числу, которое вы хотите вернуть в свой шаблон, или «лишние» переменные представляют собой простые структуры, такие как целые числа или логические значения,

2
ответ дан 7 November 2019 в 08:29
поделиться

Я часто думал о следующем, но не уверен, действительно ли это полезно.

class MyStruct(object):
     pass

def my_view(request, id):
    c = MyStruct()
    c.customer = ..
    c.invoice = ..
    c.date = ..
    return render_to_response('xxx,html',c.__dict__)
27
ответ дан 7 November 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: