当涉及到构造函数、赋值和方法调用时,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.
相关部分是文档字符串的
@type peasant: Person
行。
如果您还转到“文件”>“设置”>“Python 集成工具”并将“Docstring 格式”设置为“Epytext”,则 PyCharm 的“视图”>“快速文档查找”将漂亮地打印参数信息,而不是仅按原样打印所有 @ 行.
是的,您可以对方法及其参数使用特殊的文档格式,以便 PyCharm 可以知道其类型。最新的 PyCharm 版本支持最常见的文档格式。
例如,PyCharm 从 @param 样式注释中提取类型。
另请参阅 reStructuredText 和 docstring 约定 (PEP 257)。
另一个选择是 Python 3 注释。
请参阅 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
有时这对于不需要文档字符串的非公共方法很有用。作为一个额外的好处,这些注释可以通过代码访问:
>>> King.repress.__annotations__
{'peasant': <class '__main__.Person'>, 'return': <class 'bool'>}
更新:从Python 3.5已接受的PEP 484开始,使用注释指定参数和返回类型也是官方约定。
PyCharm 从 @type pydoc 字符串中提取类型。请参阅 PyCharm 文档此处和此处以及Epydoc 文档。 它位于 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.
相关部分是文档字符串的
@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