Парсер 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".