2012-03-03 15 views
8

Estoy escribiendo una aplicación de Django, donde espero usar muchos comandos de management.py. Me gusta la idea de las funciones de Python tienen parámetros con valores por defecto, donde se define el parámetro como:Argumentos de Python y mejores prácticas de palabras clave-argumentos

def function(param1=value1) 

Así que estoy escribiendo mis comandos de administración de tal manera que usted introduce la siguiente manera:

python manage.py createdb user=some_user db_name=some_name 

Así lo que puedo decir, comandos management.py no aceptan este tipo de lista de argumentos, por lo que he creado un ayudante para hacer lo siguiente:

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 

¿hay una mejor manera de hacer esto?

Respuesta

5

En lugar de rodar su propia, se puede usar el estilo de parámetro típico, y usar algo como argparse a analizarlo:

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

usted acaba de definir su analizador argumento y luego pasa el argumento args a su parse_args() método.

+0

Estoy teniendo problemas para conseguir que esto funcione. La clase BaseCommand necesita tener las opciones agregadas a su option_list para que reconozca la opción. Pero de acuerdo con la publicación a continuación, el uso de make_option ha quedado en desuso. Por lo tanto, me gustaría usar argparse, pero ¿cómo agrego los argumentos a la clase BaseCommand? –

+1

Honestamente, me gustaría ir con lo que sugirió @nrabinowitz: use la funcionalidad incorporada de Django cuando trabaje con Django. – Amber

12

Actualizado: Per @rix, las versiones posteriores de Django ahora utilizan argparse, que debe ser preferido.

respuesta original:

creo que el enfoque estándar aquí es utilizar optparse, que puede engancharse a la opción existente analizar Django usa ya. El ejemplo 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'), 
     ) 
    # ... 

Ahora usted tiene sus argumentos de línea de comandos disponibles en el diccionario options. Los documentos de Python dicen que optparse está en desuso, pero supongo que los documentos de Django lo recomiendan porque es lo que Django usa para sus propios comandos de administración.

+9

Realmente, ¿me va a dar -1 por citar el manual de Django sobre una pregunta sobre las mejores prácticas de Django, aunque noté que la recomendación de Django estaba obsoleta? Venga. – nrabinowitz

+1

Sí, lo siento. No recomendamos el código obsoleto. No importa si django lo usa o no. [Relacionado] (http://blog.zacharyvoase.com/2009/12/09/django-boss/) – wim

+7

En general, estoy de acuerdo. Pero la pregunta del OP no es sobre el análisis arg genérico de Python, sino sobre la forma recomendada de hacerlo * para los comandos de administración de Django *. Y * hay * una forma recomendada, usando optparse, en el manual de Django, recomendado en parte porque de esa manera puedes jugar bien con el propio análisis de Django. No importa si Django lo usa, si está creando código para trabajar con Django. – nrabinowitz

3

Docs @ más de Python argparse son grandes, pero para una rápida respuesta copiar y pegar para resolver la pregunta original (post Django 1.8) - Aquí van:

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'