Pregunta

Cuando se trata de constructores, tareas y llamadas de método, el IDE PyCharm es bastante bueno para analizar mi código fuente y descubrir qué tipo debería ser cada variable. Me gusta cuando es correcto, porque me da una buena información de combate y parámetros de código, y me da advertencias si trato de acceder a un atributo que no existe.

Pero cuando se trata de parámetros, no sabe nada. Los desplegables de combustión de código no pueden mostrar nada, porque no saben qué tipo será el parámetro. El análisis del código no puede buscar advertencias.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

peasant = Person("Dennis", 37)
# PyCharm knows that the "peasant" variable is of type Person
peasant.dig_filth()   # shows warning -- Person doesn't have a dig_filth method

class King:
    def repress(self, peasant):
        # PyCharm has no idea what type the "peasant" parameter should be
        peasant.knock_over()   # no warning even though knock_over doesn't exist

King().repress(peasant)
# Even if I call the method once with a Person instance, PyCharm doesn't
# consider that to mean that the "peasant" parameter should always be a Person

Esto tiene cierta cantidad de sentido. Otros sitios de llamadas podrían pasar cualquier cosa para ese parámetro. Pero si mi método espera que un parámetro sea de tipo, digamos, pygame.Surface, Me gustaría poder indicar eso a Pycharm de alguna manera, por lo que puede mostrarme todo SurfaceLos atributos en su menú desplegable de combustión de código y resaltan advertencias si llamo el método incorrecto, y así sucesivamente.

¿Hay alguna manera de darle a Pycharm una pista y decir "PSST, se supone que este parámetro es de tipo X"? (O tal vez, en el espíritu de los idiomas dinámicos, "se supone que este parámetro se burla como una x"? Estaría bien con eso).


EDITAR: La respuesta de CrazyCoder, abajo, hace el truco. Para cualquier recién llegado como yo que desee el resumen rápido, aquí está:

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

La parte relevante es la @type peasant: Person línea del documento.

Si también va a Archivo> Configuración> Herramientas integradas de Python y establece "Formato DOCSTRING" en "Epytext", entonces la vista de documentación rápida de PyCharm> Imprimirá bastante la información de los parámetros en lugar de solo imprimir todos los @-lines As-IS.

¿Fue útil?

Solución

Sí, puede usar el formato de documentación especial para los métodos y sus parámetros para que Pycharm pueda conocer el tipo. Versión reciente de Pycharm admite los formatos de documento más comunes.

Por ejemplo, Pycharm extrae tipos de @Param Style Comentarios.

Ver también reestructuredText y Convenciones de documentos (Pep 257).

Otra opción son las anotaciones de Python 3.

Por favor Consulte la sección de documentación de Pycharm Para más detalles y muestras.

Otros consejos

Si está utilizando Python 3.0 o posterior, también puede usar anotaciones en funciones y parámetros. Pycharm interpretará estos como el tipo que se espera que tengan los argumentos o los valores de retorno:

class King:
    def repress(self, peasant: Person) -> bool:
        peasant.knock_over() # Shows a warning. And there was much rejoicing.

        return peasant.badly_hurt() # Lets say, its not known from here that this method will always return a bool

A veces esto es útil para métodos no públicos, que no necesitan un documento. Como beneficio adicional, se puede acceder a esas anotaciones por código:

>>> King.repress.__annotations__
{'peasant': <class '__main__.Person'>, 'return': <class 'bool'>}

Actualizar: A partir de PEP 484, que ha sido aceptado para Python 3.5, también es la convención oficial especificar tipos de argumentos y retorno utilizando anotaciones.

Pycharm extrae tipos de una cadena @Type Pydoc. Ver Pycharm Docs aquí y aquí, y Documentos epydoc. Está en la sección 'Legacy' de Pycharm, tal vez carece de alguna funcionalidad.

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

La parte relevante es la @type peasant: Person línea del documento.

Mi intención no es robar puntos de CrazyCoder o del interlocutor original, por supuesto, darles sus puntos. Pensé que la respuesta simple debería estar en una ranura de 'respuesta'.

Estoy usando el código PyCharm Professional 2016.1 escribiendo PY2.6-2.7, y descubrí que, usando reestructuredText, puedo expresar tipos de una manera más sucinta:

class Replicant(object):
    pass


class Hunter(object):
    def retire(self, replicant):
        """ Retire the rogue or non-functional replicant.
        :param Replicant replicant: the replicant to retire.
        """
        replicant.knock_over()  # Shows a warning.

Ver: https://www.jetbrains.com/help/pycharm/2016.1/type-intinting-in-pycharm.html#legacy

También puede afirmar un tipo y Pycharm lo inferirá:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top