Парсер add_mutually_exclusive_group - как установить значение по умолчанию?

Мы используем Python и Django для наших сайтов. Мы задаем тестовую команду, которая добавляется к стандартной тестовой команде Django:

from django.core.management.commands import test


class Command(test.Command):
    def add_arguments(self, parser):
        super().add_arguments(parser=parser)

        group = parser.add_argument_group('language options', 'These arguments are mutually exclusive. Default: --test-default-languages')
        language_group = group.add_mutually_exclusive_group()
        language_group.add_argument(
            "--test-all-languages",
            action="store_true",
            help="Run tests for all languages, and don't skip languages.",
        )
        language_group.add_argument(
            "--test-default-languages",
            action="store_true",
            help="Run tests for default languages (English, French, Hebrew + randomly select one more language or none).",
        )
        language_group.add_argument(
            "--test-only-english",
            action="store_true",
            help="Run tests for only English.",
        )

        # ...

Теперь в моделях мы имеем такой код:

    class SiteDiscoverRunner(DiscoverRunner):
        def __init__(self, *args, **kwargs):
            # ...
            super().__init__(*args, **kwargs)
            self.test_all_languages = kwargs.get('test_all_languages', False)
            self.test_default_languages = kwargs.get('test_default_languages', False)
            self.test_only_english = kwargs.get('test_only_english', False)
            if ((self.test_all_languages is False) and (self.test_only_english is False)):
                self.test_default_languages = True

Тесты должны запускаться с одним из перечисленных выше аргументов командной строки или без них. Если нет, то значение test_default_languages должно быть true.

Я хотел бы узнать, может ли парсер сделать self.test_default_languages True, если ни один из 3 аргументов не указан, чтобы я мог удалить команду self.test_default_languages = True в модели? Я искал и не нашел, как это сделать.

Я задал вопрос на discuss.python.org и получил ответ, а также нашел решение:

Тестовая команда:

from django.core.management.commands import test


class Command(test.Command):
    def add_arguments(self, parser):
        super().add_arguments(parser=parser)

        group = parser.add_argument_group('language options', 'These arguments are mutually exclusive. Default: --test-default-languages')
        language_group = group.add_mutually_exclusive_group()
        language_group.add_argument(
            "--test-all-languages",
            action="store_const",
            const="test-all-languages",
            dest="test_languages",
            help="Run tests for all languages, and don't skip languages.",
        )
        language_group.add_argument(
            "--test-default-languages",
            action="store_const",
            const="test-default-languages",
            dest="test_languages",
            help="Run tests for default languages (English, French, Hebrew + randomly select one more language or none).",
        )
        language_group.add_argument(
            "--test-only-english",
            action="store_const",
            const="en",
            dest="test_languages",
            help="Run tests for only English.",
        )
        language_group.add_argument(
            "--test-only-language-code",
            action="store",
            dest="test_languages",
            help="Run tests for only one language (the given language code).",
            type=str,
        )
        parser.set_defaults(test_languages="test-default-languages")
        # Running tests with --test-only-language-code en is equivalent to running tests with --test-only-english.

        # ...

А в моделях:

    class SiteDiscoverRunner(DiscoverRunner):
        def __init__(self, *args, **kwargs):
            # ...
            super().__init__(*args, **kwargs)
            self.test_languages = kwargs.get('test_languages', None)
            # ...
            assert (self.test_languages in {'test-all-languages', 'test-default-languages', 'en', 'fr', 'de', 'es', 'pt', 'it', 'nl', 'sv', 'ko', 'fi', 'he'})
            # ...

Обратите внимание, что я также добавил аргумент "--test-only-language-code". За ним следует код языка, например "en".

Вернуться на верх