我如何告诉 PyCharm 参数应该是什么类型?

当涉及到构造函数、赋值和方法调用时,PyCharm IDE 非常擅长分析我的源代码,并计算出每个变量应该是什么类型。我喜欢它正确的时候,因为它给我很好的代码完成和参数信息,并且如果我试图访问一个不存在的属性,它会给我警告。

但是当涉及到参数的时候,它什么都不知道。代码完成下拉列表不能显示任何内容,因为它们不知道参数的类型。代码分析无法查找警告。

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,那么我希望能够以某种方式向 PyCharm 指出这一点,这样它就可以在代码完成下拉列表中显示 Surface的所有属性,并在调用错误的方法时突出显示警告,以此类推。

有没有一种方法,我可以给 PyCharm 一个提示,并说“ psst,这个参数应该是 X类型”?(或者,本着动态语言的精神,“这个参数应该像 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.

相关的部分是 docstring 的 @type peasant: Person行。

如果你也点击 File > Settings > Python Integration Tools 并将“ Docstring format”设置为“ Epytext”,那么 PyCharm 的 View > Quick Document Lookup 将会漂亮地打印参数信息,而不是仅仅打印所有的@- line。

38697 次浏览

是的,您可以为方法及其参数使用特殊的文档格式,这样 PyCharm 就可以知道类型。最新 PyCharm 版本 支持最常见的文档格式

例如,PyCharm 从 @ param 风格的评论中提取类型。

参见 ReStructuredTextDocstring 约定(PEP257)。

另一个选择是 Python3注释。

请参考 PyCharm 文档部分为更多的细节和样品。

如果使用 Python 3.0或更高版本,还可以对函数和参数使用注释。PyCharm 将这些解释为参数或返回值应该具有的类型:

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

有时,这对于不需要 docstring 的非公共方法非常有用。另一个好处是,可以通过代码访问这些注释:

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

更新 : 从已经被 Python 3.5接受的 PEP 484开始,使用注释指定参数和返回类型也是官方惯例。

PyCharm 从@type pydoc 字符串提取类型。 请参阅 PyCharm docs 给你 and 给你,and 外科医生。它在 PyCharm 的“遗留”部分,也许它缺乏一些功能。

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.

相关的部分是 docstring 的 @type peasant: Person行。

我的意图不是从 CrazyCoder 或者最初的提问者那里偷分数,而是想尽一切办法给他们分数。我只是觉得简单的答案应该放在“答案”栏里。

我正在使用 PyCharm Professional 2016.1编写 py2.6-2.7代码,我发现使用 ReStructuredText 可以更简洁地表达类型:

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

你也可以断言一个类型,Pycharm 会推断它:

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