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

2024-05-07 13:16:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我正在使用“请求”python库。

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

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

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

为什么会这样?


Tags: 方法comhttp列表getipythongoogle手动
3条回答

由于Python是一种动态类型语言,您需要确保它能够计算出什么类型的东西,并正确地检查系统上的库。试着确定你的代码中对象是什么类型。

PyCharm 2.7的一个好方法是启用运行时类型检测——PyCharm在程序运行时(在调试时)钩住程序,并在使用时检查变量的类型。

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

The settings screen of PyCharm open to show the relevant setting.

显然,值得注意的是,这并不完美—如果您进行了更改,则在执行代码之前不会更新此项,并且它只能告诉您它看到的值—您没有尝试过的其他代码路径可以设置其他类型。

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

从Python 3开始,Python还获得了对函数注释的支持。根据PEP 484,这些可以用于类型提示。有关更多信息,请参见^{}模块。这是更正式的,因此它也可以用于类似^{}的工具,类型检查器可以通过编程检查这些类型的一致性,从而为Python提供TypeScript样式的可选静态类型。

如果动态填充,PyCharm不知道dict包含什么。所以你必须事先提示PyCharm关于dict的键。Prodict这样做正是为了提示PyCharm,这样就可以完成代码。

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

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

免责声明:我是Prodict的作者。

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

相关问题 更多 >