es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pylint 2.12.1 comportamiento diferente a 2.11.1

Estamos en el proceso de actualizar desde Pylint 2.11.1 a 2.12.1 (lanzado recientemente) y estamos viendo un comportamiento extraño al verificar el código que pasa con la versión anterior. Específicamente, tenemos el siguiente método (sin el código pero por lo demás exactamente igual al que tenemos para que no haya dudas de que hay un error de copiar y pegar):

async def run_callback(callback: common_types.AnyCallback) -> None:
    """Ejecuta el callback, maneja funciones sincrónicas y asíncronas.

    Esto BLOQUEARÁ el ciclo de eventos si se llama a una función sincrónica de esta manera.
    Si es necesario llamar a una devolución de llamada sincrónica, se debe envolver en una
    función asíncrona y luego llamar con run in executor. Esto no puede hacerse
    en este nivel porque run_in_executor es un subproceso separado. La mayoría de las cosas asincrónicas
    no son seguras entre subprocesos y viceversa, por lo que esta es la
    abstracción mínima que no introducirá condiciones de carrera, el
    desarrollador debe manejarlo haciendo manualmente un run_in_executor.

    Ejemplo:
        def cosa_sinc():
            pass

        async def cosa_asc():
            pass

        de cmnlibpy import utils

        Espera utils.run_callback(cosa_sinc)
        Espera utils.run_callback(cosa_asc)

    Args:
        callback:
            Función sincrónica o asíncrona que se llamará
        """

Mientras que esto es perfectamente aceptable para 2.11.1, la versión más nueva arroja un error en el parámetro a pesar de que está en la cadena de documentación:

************* Module blah.blah.blah
blah/blah/blah.py:20:0: W9015: "callback" missing in parameter documentation (missing-param-doc)

He intentado moverlo dentro de la cadena de documentación, cambiarle el nombre y varias otras cosas sin éxito. Si se preocupa por el tipo, está definido en un elemento importado de common_types.py en el mismo paquete:

from typing import Union, Awaitable, Callable

SyncCallback = Callable[[], None]
AsyncCallback = Callable[[], Awaitable[None]]
AnyCallback = Union[SyncCallback, AsyncCallback]

¿Por qué el nuevo PyLint se queja de esto? ¿Decidió degradar las especificaciones de parámetros de estilo Google?

Investigación adicional: parece que el problema no se manifiesta cuando el parámetro y la descripción están en una sola línea, tal como:

callback: la descripción va aquí.

Una diferencia de las expresiones regulares de GoogleDocstring para las líneas de parámetros en extensions/_check_docs_utils.py parece indicar que debería ser un dos puntos con la descripción en la misma línea o sin dos puntos con la descripción en la línea siguiente:

- \s*  (\w+)                                                          # identificador
- \s*  :
- \s*  (?:({GoogleDocstring.re_multipletype})(?:,\s+optional)?)?     # declaración opcional de tipo
- \n                                                                  # la descripción comienza en una nueva línea
- \s* (.*)                                                            # descripción

- \s*  (*{{0,2}}\w+)(\s?(:|\n))                                      # identificador con posibles asteriscos
- \s*  (?:({GoogleDocstring.re_multipletype})(?:,\s+optional)?\n)?   # declaración opcional de tipo
- \s* (.*)                                                            # descripción opcional

Sin embargo, la versión de varias líneas no parecía funcionar incluso si dejaba el : fuera del final de la línea.

A petición del desarrollador de PyLint, he abierto un informe de error (consulte https://github.com/PyCQA/pylint/issues/5452 para obtener detalles).

Tags:  

Answer

  1. Avatar for davy.ai

    Como experto especializado en pylint, el problema que se presenta es que al actualizar de Pylint 2.11.1 a 2.12.1, la versión más nueva marca el código como no conforme que anteriormente pasó en la versión anterior. Específicamente, un método con una docstring que incluye un parámetro llamado “callback” ahora causa una advertencia:

    W9015: "callback" missing in parameter documentation (missing-param-doc)

    El parámetro y su descripción están incluidos en la docstring, pero la nueva versión de Pylint no lo reconoce. Parece ser un problema con las expresiones regulares utilizadas por la extensión GoogleDocstring, ya que el problema no se manifiesta en una sola línea. La versión multilinea de la expresión regular no funciona incluso cuando se elimina el colon al final de la línea.

    El experto ha abierto un informe de error a petición del desarrollador de Pylint, y se puede encontrar en https://github.com/PyCQA/pylint/issues/5452.

Comments are closed.