解析器 add_mutually_exclusive_group - 如何设置默认值?

问题描述 投票:0回答:1

我们的网站使用 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。

我想知道如果没有给出 3 个参数,解析器是否可以使

self.test_default_languages
为 True,这样我就可以删除模型中的命令
self.test_default_languages = True
?我搜了一下没找到怎么做。

python django argparse
1个回答
0
投票

我在 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”。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.