Лучшие аргументы в Python и ключевые слова-аргументы - PullRequest
8 голосов
/ 03 марта 2012

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

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

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

Ответы [ 3 ]

12 голосов
/ 03 марта 2012

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

Оригинальный ответ:

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

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 использует для своих собственных команд управления.

5 голосов
/ 03 марта 2012

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

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

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

3 голосов
/ 10 августа 2016

Документы над @ 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...