2011-06-11 20 views
158

Cuando se trata de constructores, asignaciones y llamadas a métodos, PyCharm IDE es bastante bueno para analizar mi código fuente y averiguar qué tipo debe ser cada variable. Me gusta cuando es correcto, porque me da una buena información de parámetros y finalización de código, y me da advertencias si trato de acceder a un atributo que no existe.¿Cómo puedo decirle a PyCharm qué tipo de parámetro se espera que sea?

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 de qué tipo será el parámetro. 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 un cierto sentido. Otros sitios de llamadas podrían pasar cualquier cosa por ese parámetro. Pero si mi método espera que un parámetro sea del tipo, digamos, pygame.Surface, me gustaría poder indicar eso a PyCharm de alguna manera, de modo que pueda mostrarme todos los atributos de Surface en su menú desplegable de finalización de código, y resaltar advertencias si llamo al método incorrecto, y así sucesivamente.

¿Hay alguna manera de dar una pista a PyCharm y decir "psst, se supone que este parámetro es del tipo X"? (O tal vez, en el espíritu de los lenguajes dinámicos "este parámetro se supone que graznar como un X" Estaría bien con eso?.)


EDIT: respuesta de CrazyCoder, a continuación, hace lo truco. Para cualquier recién llegados como yo que quieren el breve resumen, 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 pertinente es la línea de la cadena de documentación @type peasant: Person.

Si también va a Archivo> Configuración> Herramientas integradas de Python y establece "Formato de documento" a "Epytext", PyCharm's View> Búsqueda rápida de documentación imprimirá bastante la información del parámetro en lugar de solo imprimir todas las líneas @ como es.

+7

es de notar que reStructuredText comentario por favor utilice las mismas etiquetas acaba de escribir de manera diferente: '@param xx: yyy' se convierte en': param xx: yyy'. Consulte http://www.jetbrains.com/pycharm/webhelp/creating-documentation-comments.html – Wernight

+1

¿Por qué podemos salimos con la suya al no especificar un nombre de clase completamente calificado? – aitchnyu

Respuesta

76

Sí, puede usar un formato de documentación especial para los métodos y sus parámetros, de modo que PyCharm pueda saber el tipo. Versión reciente de PyCharm supports most common doc formats.

Por ejemplo, PyCharm extrae tipos de @param style comments.

Vea también reStructuredText y docstring conventions (PEP 257).

Otra opción es Python 3 anotaciones.

Por favor, refer to the PyCharm documentation section para más detalles y muestras.

+1

Creo que PyCharm cambió un poco el formato de documento (ver https://www.jetbrains.com/help/pycharm/using-docstrings-to-specify-types.html), ¡pero gracias! La falta de inteligencia en los parámetros me estaba volviendo loco. – stubs

43

Si está utilizando Python 3.0 o posterior, también puede usar anotaciones sobre funciones y parámetros. Se espera que PyCharm éstas serían interpretadas como el tipo de los argumentos o valores de retorno a tener:

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, las anotaciones se puede acceder por código:

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

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

+4

... y hay varios paquetes que usan dichas anotaciones para realizar una comprobación de tipos en tiempo de ejecución. Esto es más conveniente de usar y más fácil de leer que hacer lo mismo mediante aserciones y se puede usar selectivamente de la misma manera. '' typecheck-decorator'' es uno de esos paquetes y tiene un resumen de los demás en su documentación. (Flexible, también: ¡incluso puedes hacer mecanografía de pato con verificación de tipo!) –

3

PyCharm extrae los tipos de una cadena @type pydoc. Consulte los documentos de PyCharm here y here y Epydoc docs. Está en la sección 'heredada' de PyCharm, quizás le falte 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 pertinente es la línea de la cadena de documentación @type peasant: Person.

Mi intención no es robar puntos de CrazyCoder o del que pregunta original, concédales sus puntos. Solo pensé que la respuesta simple debería estar en un espacio de "respuesta".

0

estoy usando PyCharm Profesional 2.016,1 escritura de código py2.6-2.7, y me encontré con que el uso de reStructuredText que puede 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-hinting-in-pycharm.html#legacy

1

Usted también puede valer para un tipo y PyCharm inferirá que:

def my_function(an_int): 
    assert isinstance(an_int, int) 
    # Pycharm now knows that an_int is of type int 
    pass 
Cuestiones relacionadas