前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么有时候 PyCharm 没有智能提示?

为什么有时候 PyCharm 没有智能提示?

作者头像
不可言诉的深渊
发布2019-07-26 17:47:36
4.8K0
发布2019-07-26 17:47:36
举报

最近在一个 Python 技术交流群有人问了这么一个问题:为什么有时候 PyCharm 没有智能提示?其实这个问题我也碰到过,没有提示的原因也是非常简单,主要有 3 个原因:运行时改变一个类,使用 exec 函数执行某些属性或者变量初始化语句,使用 setattr 初始化属性或者变量。其实导致没有智能提示的原因有很多,有些太复杂了我就不讲了!

运行时改变一个类

运行时改变一个类?还有这种操作?在 Python 中,还真有这种操作。不信可以看一下下面这段代码。

代码语言:javascript
复制
class A:
 a = 'a'


if __name__ == '__main__':
 A.b = 'b'
 print(A.a, A.b)

运行结果如图所示。

可以发现并没有报错,而是在运行时给类添加一个属性 b 并用 'b' 初始化。

这就有人会问了,这和今天的问题有什么关系?其实是有关系的,不信看图。

我们都知道,Python 一切皆对象,包括类也是对象,既然是对象,用一个或者多个变量指向它当然没问题!在这里通过运行时修改指向 A 的变量 A0 来修改 A 这个类,也就是通过 A0.b = 'b' 这一语句给 A 添加一个属性 b 并用 'b' 初始化。但是,当我们想通过 A 来召唤属性 b 发现智能提示没出现这个属性。但是 A.b 是不会报错的,而且 A.b == 'b' 是 True。为什么会这样?因为 Python 是运行时才会识别类型!只要代码不运行,解释器永远不知道 A0 就是 A,所以没有智能提示是正常的!

使用 exec 函数执行某些属性或者变量初始化语句

exec 函数需要一个必选参数,这个参数是一个字符串,这个函数的功能是执行字符串中的代码,和今天的问题同样有关系,不信看图。

在构造方法 __init__ 中,属性 b 我通过调用 exec 函数来初始化,在下面我想用 A 类的实例 a 召唤属性 b 却发现智能提示还是没有 b,至于为什么?因为 exec 函数是运行时才执行的!如果没运行,解释器根本不知道 A 的实例有属性 b,这种情况没有智能提示很正常!

使用 setattr 初始化属性或者变量

setattr 用于给一个对象设置属性,需要 3 个参数:对象,属性名(字符串类型),属性值!

在构造函数中,我通过调用 setattr 来设置 A 的实例属性 b,但是在下面我想通过 A 的实例 a 召唤属性 b,依旧没有召唤出来,为什么?因为 setattr 是运行时才会执行!如果没运行,解释器根本不知道 A 的实例有属性 b,这种情况没有智能提示很正常!

其实没有智能提示的原因还有很多,比如使用元类(可以运行时修改一个类)……在这里我就不一一讲解了,最重要的就是记住 3 个字:运行时

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python机器学习算法说书人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档