python - ¿Cómo puedo decirle a PyCharm qué tipo se espera que sea un parámetro?
code-completion type-hinting (5)
Cuando se trata de constructores, asignaciones y llamadas a métodos, PyCharm IDE es bastante bueno analizando mi código fuente y averiguando 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.
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, para que pueda mostrarme todos los atributos de Surface
en el menú desplegable de finalización de código, y resaltar las 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, "se supone que este parámetro grazna como una X"? Estaría bien con eso).
EDITAR: La respuesta de CrazyCoder, a continuación, hace el truco. Para cualquier recién llegado como yo que quiera 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 @type peasant: Person
línea de @type peasant: Person
de la docstring.
Si también vas a File> Settings> Python Integrated Tools y configuras "Docstring format" en "Epytext", PyCharm''s View> Quick Documentation Lookup imprimirá bastante la información del parámetro en lugar de solo imprimir todas las líneas @ tal cual.
Estoy usando PyCharm Professional 2016.1 escribiendo el código py2.6-2.7, y encontré que usando reStructuredText 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-hinting-in-pycharm.html#legacy
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. La versión reciente de PyCharm es compatible con los formatos de documentos más comunes .
Por ejemplo, PyCharm extrae tipos de comentarios del estilo @param .
Consulte también las convenciones reStructuredText y docstring (PEP 257).
Otra opción son las anotaciones de Python 3.
Consulte la sección de documentación de PyCharm para obtener más detalles y ejemplos.
Si está usando 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 una docstring. Como beneficio adicional, se puede acceder a esas anotaciones 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, también es la convención oficial para especificar argumentos y tipos de retorno utilizando anotaciones.
También puede afirmar para un tipo y Pycharm lo deducirá:
def my_function(an_int):
assert isinstance(an_int, int)
# Pycharm now knows that an_int is of type int
pass
PyCharm extrae tipos de una cadena @type pydoc. Vea los documentos de PyCharm here y here , y los documentos de Epydoc . 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 relevante es @type peasant: Person
línea de @type peasant: Person
de la docstring.
Mi intención no es robar puntos de CrazyCoder o del encuestador original, de todos modos darles sus puntos. Solo pensé que la respuesta simple debería estar en un espacio de "respuesta".