Як правильно віддавати команди, Олександра Кошеля, 0

Як правильно віддавати команди

Про корисну можливість робити свої команди для для manage.py я вже писав досить-таки давно. Але оскільки користуюся ними регулярно, то з того часу вже склалися деякі "правила хорошого тону" з написання цих команд. Одне з них - всередині методу execute команди не варто розраховувати на те, що всі опції, для яких ви навіть прописали default значення, на самому справи присутні.

Покажу на прикладі. Типова команда:

Якщо запускати це команду через командний рядок і без вказівки опції --foo. то все буде добре - optparse люб'язно підставить значення за замовчуванням і його можна буде спокійно використовувати.

Але для виклику команд є ще один спосіб - всередині іншого модуля за допомогою функції call_command з django.core.management. І в цьому випадку аргументи і опції передають як параметри функції і при цьому не враховуються значення за замовчуванням, зазначені в option_list. Тобто якщо ви викликали call_command ( "foobar") без опції foo. то код зламається з KeyError.

Якщо команду ви ж і написали, то рішення досить прості.

Можна, або в execute прописувати параметри і значення за замовчуванням в аргументах методу. Ось так:

Або, не брати значення опції безпосередньо по ключу зі словника, а "підстрахуватися" через get:

Але як видно, ці два способи змушують повторно вказувати значення за замовчуванням, що не зручно і призводить до небажаних помилок.

А ось якщо команда в чужому додатку, то ви приречені при такому використанні явно вказувати всі опції і навіть ті значення за замовчуванням яких вас цілком влаштовують. Не зручно.

Тікет і патч вже є, так що можливо через деякий час ця неприємна особливість виклику команд зникне. Почекаємо.

Схожі статті