Python参数和关键字参数最佳实践

时间:2012-03-03 04:32:54

标签: python django

我正在编写一个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 个答案:

答案 0 :(得分:12)

<强>更新 根据@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用于自己的管理命令的东西。

答案 1 :(得分:5)

您可以使用典型的参数样式,而不是滚动自己的参数样式,并使用类似argparse的内容来解析它:

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

您只需定义参数解析器,然后将args参数传递给其parse_args()方法。

答案 2 :(得分:3)

@ 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'