2012-03-03 2 views
8

Я пишу приложение Django, где я ожидаю использовать многие команды management.py. Мне нравится идея функция питон, имеющие параметры со значениями по умолчанию, где вы определяете Пары как:Аргументы и аргументы аргументов ключевых слов и аргументов

def function(param1=value1) 

Так я пишу мои команды управления таким образом, что вы вводите следующий образом:

python manage.py createdb user=some_user db_name=some_name 

Так насколько я могу сказать, management.py команда не принимает этот тип списка аргументов, поэтому я создал помощник, чтобы сделать следующее:

def process_args(args=None): 
    kwargs = {} 
    if not args: 
     return kwargs 
    for i in args: 
     try: 
      k,v = i.split('=') 
      kwargs[k] = v 
     except ValueError, ve: 
      raise CommandError("Please Enter All Arguments as key=value. e.g. user=admin") 
    return kwargs 

есть ли лучший способ сделать это?

ответ

5

Вместо того, чтобы добавить собственные, вы могли бы использовать типичный стиль параметров, и использовать что-то вроде argparse разобрать его:

python manage.py createdb --user=some_user --db_name=some_name 

Вы бы просто определить свой аргумент анализатор, а затем передать args аргумент его parse_args() метод.

+0

У меня возникли проблемы с получением этой работы. Класс BaseCommand должен иметь опции, добавленные в свой список опций, чтобы он мог распознать эту опцию. Но согласно сообщению ниже, использование make_option устарело. Поэтому я хотел бы использовать argparse, но как добавить аргументы в класс BaseCommand? –

+1

Честно говоря, я бы пошел с тем, что предложил @nrabinowitz - использовать встроенную функциональность Django при работе с Django. – Amber

12

Обновлено: Per @rix, более поздние версии Django теперь используют argparse, которое должно быть предпочтительным.

Оригинал Ответ:

Я считаю, что стандартный подход здесь заключается в использовании optparse, который может зацепить в существующий вариант разборе Django использует уже. Пример from the 1.6 docs:

from optparse import make_option 

class Command(BaseCommand): 
    option_list = BaseCommand.option_list + (
     make_option('--delete', 
      action='store_true', 
      dest='delete', 
      default=False, 
      help='Delete poll instead of closing it'), 
     ) 
    # ... 

Теперь у вас есть свои аргументы командной строки, доступные в options словаре. Документы Python говорят, что optparse устарел, но я полагаю, что документы Django рекомендуют его, потому что это то, что Django использует для своих собственных команд управления.

+9

Действительно, вы дадите мне -1 для цитирования руководства Django по вопросу о лучших практиках Django, хотя я заметил, что рекомендация Django устарела? Давай. – nrabinowitz

+1

Да, извините. Не рекомендуется использовать устаревший код. Не имеет значения, использует ли это django или нет. [Related] (http://blog.zacharyvoase.com/2009/12/09/django-boss/) – wim

+7

В общем, я бы согласился. Но вопрос OP заключается не в генерации парного кода Python, а в отношении рекомендуемого способа * для команд управления Django *. И там * * рекомендуется, используя optparse, в руководстве Django - рекомендуется отчасти потому, что таким образом вы хорошо играете с собственным анализом Django. Неважно, использует ли Django, если вы создаете код для работы с Django. – nrabinowitz

3

Docs над @ Python argparse велики, но для быстрого копирования пасты ответ решить оригинальный вопрос (пост Django 1.8) - здесь вы идете:

class Command(BaseCommand): 

    def add_arguments(self, parser): 
     parser.add_argument(
      '-something', 
      action='store', 
      dest='something', 
      default=None, 
      help="something", 
     ) 

    def handle(self, *args, **options): 
     print(options['something']) 

python manage.py your_command -something='something' 
Смежные вопросы