Pycharm:代码完成没有给出建议

问题描述 投票:11回答:3

说我正在使用'requests'python库。

req = requests.get("http://google.com")

在此之后,如果我键入req.,我应该得到一个我可以访问的所有方法的列表。但由于某种原因,我没有,即使我手动按ctrl-space。

如果我在ipython中尝试这个,我会得到自动完成建议。即使我通过pycharm中内置的python控制台尝试它,我也会得到建议。

为什么会这样?

python pycharm
3个回答
21
投票

由于Python是一种动态类型语言,因此您需要确保它能够确定哪些类型,并正确检查系统上的库。尝试确保对象在代码中的类型很明显。

PyCharm 2.7(当版本为数字时)的一个好方法是启用运行时类型检测 - PyCharm在运行时(在调试时)挂钩到程序中,并在使用时检查变量的类型。

您可以通过转到设置,转到“构建,执行,部署”部分,然后转到“Python调试器”小节并启用“收集运行时类型信息以获取代码洞察”来启用此功能。

显然值得注意的是,这并不完美 - 如果您进行更改,这将不会更新,直到执行代码,并且它只能告诉您它已经看到的值 - 您还没有尝试过的其他代码路径设置其他类型。

您还可以使用包含有关参数和返回值类型信息的Epydoc或Sphinx样式文档字符串来“告诉”PyCharm。 PyCharm将使用这些来改进它的检查。

从Python 3开始,Python也获得了对函数注释的支持。根据PEP 484,它们可以用于类型提示。有关更多信息,请参阅typing模块。这是更正式的,所以它也可以用于像mypy这样的工具,这是一种类型检查器,可以通过编程方式检查这些类型的一致性,为Python提供TypeScript风格的可选静态类型。


7
投票

Python是一种动态类型语言,这意味着“get”函数不会声明其返回类型。当您在IPython或PyCharm控制台中输入代码时,代码实际上正在执行,并且可以检查正在运行的解释器中的对象实例并获取其方法列表。当您在PyCharm或任何其他Python IDE中输入代码时,它不会被执行,并且只能使用静态分析来推断方法的返回类型。在所有情况下都不可能这样做。


0
投票

如果你动态填充它,PyCharm不知道dict包含什么。所以你必须提前告诉PyCharm关于dict的钥匙。 Prodict正是这样做以暗示PyCharm,所以你得到代码完成。

首先,如果您希望能够访问响应对象,则必须获取json响应并将其转换为dict。这是通过.json()requests方法实现的,如下所示:

response = requests.get("https://some.restservice.com/user/1").json()

好的,我们将它加载到dict对象,现在您可以使用括号语法访问键:

print(response['name'])

既然你要求自动代码完成,你当然需要提示PyCharm关于dict的密钥。如果您已经知道respone模式,则可以使用Prodict来提示PyCharm:

class Response(Prodict):
    name: str
    price: float

response_dict = requests.get("https://some.restservice.com/user/1").json()

response = Response.from_dict(response_dict)
print(response.name)
print(response.price)

在上面的代码中,nameprice属性都是自动编译的。

如果您不知道响应的架构,那么您仍然可以使用点符号来访问dict属性,如下所示:

response_dict = requests.get("https://some.restservice.com/user/1").json()
response = Prodict.from_dict(response_dict)
print(response.name)

但是代码完成将无法使用,因为PyCharm无法知道架构是什么。

更重要的是,Prodict类直接来自dict,所以你也可以用它作为dict

这是Prodict repo的截图,说明代码完成:

Prodict code completion

免责声明:我是产品的作者。

© www.soinside.com 2019 - 2024. All rights reserved.