我怎么能告诉PyCharm什么types的参数预计是什么?

当谈到构造函数,赋值和方法调用时,PyCharm IDE非常擅长分析我的源代码,并找出每个variables应该是什么types。 我喜欢它是正确的,因为它给了我很好的代码完成和参数信息,并且如果我尝试访问不存在的属性,它会给我警告。

但是当涉及到参数时,它什么都不知道。 代码完成下拉菜单不能显示任何内容,因为他们不知道参数是什么types。 代码分析不能查找警告。

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 

这有一定的意义。 其他呼叫站点可以传递任何参数。 但是如果我的方法期望一个参数是pygame.Surface的types,我想能够以某种方式向PyCharm指出,所以它可以在代码完成下拉菜单中显示Surface的所有属性,如果我调用错误的方法,则突出显示警告,等等。

有没有办法给PyCharm一个提示,并说“psst,这个参数应该是X型”? (或者,也许,在dynamic语言的精神中,“这个参数应该像X一样嘎嘎”?我会很好的。)


编辑: CrazyCoder的答案,下面,伎俩。 对于像我这样想要快速总结的新手来说,这里是:

 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. 

相关部分是@type peasant: Person文档string的@type peasant: Person行。

如果你也去了文件>设置> Python集成工具,并将“文档string格式”设置为“Epytext”,然后PyCharm的查看>快速文档查找将漂亮的打印参数信息,而不是只是打印所有的@线。

是的,你可以使用特殊的文档格式的方法和他们的参数,使PyCharm可以知道types。 最近的PyCharm版本支持大多数常用的文档格式 。

例如,PyCharm从@param样式注释中提取types。

另请参阅reStructuredText和文档string约定 (PEP 257)。

另一种select是Python 3注释。

有关更多详细信息和示例,请参阅PyCharm文档部分 。

如果您使用的是Python 3.0或更高版本,则还可以在函数和参数上使用注释。 PyCharm会将这些解释为参数或返回值预期会有的types:

 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 

有时这对非公开的方法很有用,不需要文档string。 作为一个额外的好处,这些注释可以通过代码访问:

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

更新 :截至Python 3.5已经接受的PEP 484 ,它也是使用注释来指定参数和返回types的正式约定。

PyCharm从@type pydocstring中提取types。 请参阅这里和这里的 PyCharm文档以及Epydoc文档 。 它在PyCharm的“传统”部分,可能缺less一些function。

 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. 

相关部分是@type peasant: Person文档string的@type peasant: Person行。

我的目的不是要从CrazyCoder或原来的提问者那里窃取点数,尽可能的给他们点数。 我只是认为简单的答案应该在一个“答案”插槽。

我使用PyCharm Professional 2016.1编写py2.6-2.7的代码,我发现使用reStructuredText我可以用更简洁的方式expressiontypes:

 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. 

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