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

Sam*_*amy 8 python django

我正在编写一个Django应用程序,我期望使用许多management.py命令.我喜欢python函数具有默认值参数的想法,您可以将param定义为:

def function(param1=value1)
Run Code Online (Sandbox Code Playgroud)

所以我正在写我的管理命令,你输入如下:

python manage.py createdb user=some_user db_name=some_name
Run Code Online (Sandbox Code Playgroud)

据我所知,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
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

nra*_*itz 12

更新: 根据@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'),
        )
    # ...
Run Code Online (Sandbox Code Playgroud)

现在,您可以在options字典中使用命令行参数.Python文档说optparse不赞成,但我认为Django文档推荐它,因为它是Django用于自己的管理命令的东西.

  • 真的,你会给我-1引用关于Django最佳实践的问题的Django手册,尽管我注意到Django的推荐被弃用了?来吧. (9认同)
  • 总的来说,我同意.但OP的问题不是关于通用的Python arg解析,而是关于为Django管理命令执行此操作的推荐方法*.在Django手册中有*推荐使用optparse的方法 - 部分推荐,因为这样你可以很好地使用Django自己的解析.如果您正在构建与Django一起使用的代码,Django是否使用它确实很重要. (7认同)
  • +1是理性的.对于不使用弃用的代码而言,这是好的和好的,但如果你的应用程序依赖于特定版本的Django和特定版本的Python,那么只使用它设计的框架才有意义.我相信未来的Django版本会切换到argparse,然后我们都可以赢回@Wim的好感 (4认同)

Amb*_*ber 5

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

python manage.py createdb --user=some_user --db_name=some_name
Run Code Online (Sandbox Code Playgroud)

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