¿Cómo puedo decirle a PyCharm qué tipo de parámetro se espera que sea un parámetro?

Cuando se trata de constructores, asignaciones y llamadas de métodos, el IDE de PyCharm es bastante bueno para analizar mi código fuente y determinar qué tipo de variable debería ser cada variable. Me gusta cuando está bien, porque me da una buena información de parámetros y de terminación de código, y me advierte si bash acceder a un atributo que no existe.

Pero cuando se trata de parámetros, no sabe nada. Los menús desplegables de finalización de código no pueden mostrar nada, porque no saben qué tipo de parámetro será. El análisis de 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 cierto sentido. Otros sitios de llamada podrían pasar cualquier cosa por ese parámetro. Pero si mi método espera que un parámetro sea de tipo, por ejemplo, pygame.Surface , me gustaría poder indicarle a PyCharm de alguna manera, para que me muestre todos los atributos de Surface en su menú desplegable de finalización de código, y resalte las advertencias si llamo al método incorrecto, y así sucesivamente.

¿Hay alguna manera de que le pueda dar una sugerencia a PyCharm y decir “psst, se supone que este parámetro es de tipo X”? (O tal vez, en el espíritu de los lenguajes dynamics, “se supone que este parámetro se muestra como una X”. Estaría bien con eso).


EDIT: respuesta de CrazyCoder, a continuación, hace el truco. Para todos los recién llegados como yo que quieran un 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 el @type peasant: Person línea de la @type peasant: Person de la cadena de documentos.

    Si también va a Archivo> Configuración> Herramientas integradas de Python y configura “Formato de cadena de documentos” a “Epytext”, entonces la Vista de PyCharm> Búsqueda rápida de documentación imprimirá la información del parámetro en lugar de imprimir todas las líneas @ tal como están.

    Sí, puede usar un formato de documentación especial para los métodos y sus parámetros para que PyCharm pueda conocer el tipo. La versión reciente de PyCharm es compatible con los formatos de documentos más comunes .

    Por ejemplo, PyCharm extrae tipos de comentarios de estilo @param .

    Consulte también las convenciones sobre texto estructurado y la cadena de documentación (PEP 257).

    Otra opción es Python 3 anotaciones.

    Consulte la sección de documentación de PyCharm para obtener más detalles y ejemplos.

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

     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 una cadena de documentación. Como beneficio adicional, se puede acceder a esas anotaciones por código:

     >>> King.repress.__annotations__ {'peasant': , 'return': } 

    Actualización : A partir de la PEP 484 , que ha sido aceptada para Python 3.5, también es la convención oficial para especificar los tipos de argumento y retorno mediante anotaciones.

    PyCharm extrae tipos de una cadena @type pydoc. Consulte los documentos de PyCharm aquí y aquí , y los documentos de Epydoc . Está en la sección de ‘legado’ 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 el @type peasant: Person línea de la @type peasant: Person de la cadena de documentos.

    Mi intención no es robar puntos de CrazyCoder o del interrogador original, por supuesto, darles sus puntos. Simplemente pensé que la respuesta simple debería estar en una ranura de “respuesta”.

    Estoy usando PyCharm Professional 2016.1 escribiendo el código py2.6-2.7, y encontré que al usar reStructuredText puedo express 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. 

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

    También puede hacer valer para 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