2011-05-09 7 views
16

Dada esta clase de Python, implementando un formulario de Django, ¿cómo lo rompería adecuadamente para cumplir con los estándares PEP8?¿Cómo romperías apropiadamente esta línea para que coincida con las reglas de pep8?

class MyForm(forms.Form): 
    categories = forms.CharField(required=False, 
           widget=forms.SelectMultiple(choices=CATEGORY_VALUE),            
           label="Categories") 
    additional_item_ship_cost = forms.CharField(required=False, max_length=10,              
               label="Additional Item Ship Cost") 

En concreto, los parámetros widget = y etiqueta = infringen las reglas PEP8 para la longitud de línea.

Lo que me viene a la mente inmediatamente es que podía definir el widget y la etiqueta fuera de la clase y luego usarlos en la definición de la clase, pero eso se siente muy poco pitónico.

+0

'' blah_blah_cost' es un Charfield'? –

+0

Sí, eso es parte de una regla de negocios: se usa para mostrar. Sé que suena extraño, pero eso no es realmente relevante para la pregunta que hice. –

+0

PEP 8 no dice, para bien o para mal. Sin embargo, si desea seguirlo dogmáticamente, podría usar variables "explicativas" para los parámetros excesivamente largos. (Aunque esto parece algo tonto para la constante de cadena). –

Respuesta

22

No creo PEP8 dice mucho sobre él, pero me gustaría ir simplemente con doble sangría para los parámetros:

class MyForm(forms.Form): 
    categories = forms.CharField(
      required=False, 
      widget=forms.SelectMultiple(choices=CATEGORY_VALUE), 
      label="Categories" 
     ) 
    additional_item_ship_cost = forms.CharField(
      required=False, 
      max_length=10, 
      label="Additional Item Ship Cost" 
     ) 
+0

Eso tiene sentido. ¡Gracias por tu respuesta! –

+2

PEP8 dice sobre esto [un poco] (http: //www.python.org/dev/peps/pep-0008/# indentation). En resumen, todo es más o menos como en esta respuesta, sin embargo, la sangría doble (8 espacios) no es necesaria, y el cierre de paren se deja en la línea después del último argumento. (En mi humilde opinión, está bien tener el cierre de Paren en la línea siguiente si hay una coma después del último argumento, a menos que comience con un operador de [scatter] (http://en.wikibooks.org/wiki/Think_Python/Tuples#Variable-length_argument_tuples) .) – Tony

+0

estilo js. ¡Me gusta! –

1

Usted ya sabe que se puede dividir una línea dentro parens en una coma. ¿Sabías que siempre se puede utilizar la combinación de barra invertida-salto de línea para dividir líneas donde no se puede dividir de otro modo ellos ?:

class MyForm(forms.Form): 
    categories = forms.CharField(required=False, 
           widget=forms.SelectMultiple(choices=\ 
            CATEGORY_VALUE),            
           label="Categories") 
    additional_item_ship_cost = forms.CharField(required=False, max_length=10,              
               label=\ 
               "Additional Item Ship Cost") 

Además, usted puede no saber que Python concatenar cadenas literales adyacentes, de lanzamiento basura cualquier espacio en blanco entre ellos, lo que lo anterior podría reescribirse como:

class MyForm(forms.Form): 
    categories = forms.CharField(required=False, 
           widget=forms.SelectMultiple(choices=CATEGORY_VALUE),            
           label=\ 
            "Categories") 
    additional_item_ship_cost = forms.CharField(required=False, max_length=10,              
               label="Additional"\ 
                " Item Ship Cost") 

por último, dentro de parens, puede dividir las líneas en un 'punto' al igual que se puede en una coma, y ​​se puede utilizar parens sólo para obtén esta habilidad:

class MyForm(forms.Form): 
    categories = forms.CharField(required=False, 
           widget=forms. 
            SelectMultiple(choices=\ 
            CATEGORY_VALUE),            
           label="Categories") 
    additional_item_ship_cost = (forms. 
            CharField(required=False, max_length=10,              
               label="Additional "\ 
                "Item Ship Cost")) 

Combine todo esto con el desentinte juicioso de las líneas divisorias posteriores, y debería poder evitar exceder una línea de 80 caracteres.

+0

Gracias por su excelente respuesta, es una pena que no pueda marcar dos respuestas como respuestas. –

+2

-1. El uso de barras diagonales inversas para escapar de los saltos de línea es propenso a errores de rastreo de espacios en blanco invisibles. Y al no romper la apuesta abierta, sus líneas de continuación se sangran una gran cantidad, y esa cantidad se acopla innecesariamente a la longitud de la primera línea. Mucho mejor para romper en el paren abierto, sangría una cantidad estándar (8 o 4 columnas), alinee todos los parámetros en esa sangría, y no utilice la continuación de barra invertida en absoluto. – bignose

3

Estoy de acuerdo con el uso de la indentación doble (8 columnas) para las líneas de continuación, ya que distingue fácilmente la continuación de la sangría del bloque. También quiero que la sangría sea independientemente de la longitud de la primera línea; la longitud cambiará a medida que se mantenga el código, pero eso no debería requerir el cambio de las líneas de continuación.

Así que no alinee las líneas de continuación con nada en la primera línea; en su lugar, utiliza la misma sangría relativa para cualquier línea de continuación.

Las barras diagonales inversas para la continuación son problemáticas (los espacios en blanco al final invisibles pueden cambiar el efecto), y afortunadamente casi nunca son necesarias, ya que Python automáticamente continúa la instrucción dentro de la sintaxis de horquillado abierto. Llamar a las llamadas a la función de abrir-paren (y las indicaciones en la llave abierta, listas en el corchete abierto, etc.) es lo primero que busco.

Así que lo haría:

class MyForm(forms.Form): 
    categories = forms.CharField(
      required=False, 
      widget=forms.SelectMultiple(
       choices=CATEGORY_VALUE), 
      label="Categories") 
    additional_item_ship_cost = forms.CharField(
      required=False, max_length=10, 
      label="Additional Item Ship Cost") 
+0

Give 'choices = CATEGORY_VALUE),' un salto de indention ya que es un argumento anidado? De todos modos, un enfoque limpio. – hiwaylon

Cuestiones relacionadas