我用 Pycharm pro 开发,为什么有些代码没有自动提示,但可以执行

2017-03-06 14:55:21 +08:00
 NBurton

Python3.6 + Pycharm pro 2016.3.2 已经把各种自动补全、代码提示都打开了

例如: threading.Lock 提示是变量, threading.RLock()是方法, lock=threading.Lock(); lock.acquire() 是提示不出来的,但执行没问题,

再比如:安装了 PyMySQL pymysql.connect()完全不提示。

请问这是为什么?

3017 次点击
所在节点    Python
4 条回复
billgreen1
2017-03-06 21:36:00 +08:00
Pycharm 需要索引你的安装包才会提示的
NBurton
2017-03-06 22:03:07 +08:00
那为什么 threading 模块下有的可以提示,有的不行呢
crazypig14
2017-03-07 10:52:06 +08:00
pycharm 的类型推断逻辑 参考这个
https://www.jetbrains.com/help/pycharm/2016.3/type-hinting-in-pycharm.html

Lock 是 threading 下的一个类,应该是这个类描述没遵循任何一条规则,所以推断不出来。。
NoAnyLove
2017-03-08 05:51:54 +08:00
这是因为:

* threading 是对_thread 模块的高级封装
* 看这里: https://github.com/python/cpython/blob/master/Lib/threading.py#L33

```python
_allocate_lock = _thread.allocate_lock
```

* 还有这里: https://github.com/python/cpython/blob/master/Lib/threading.py#L72

```python
Lock = _allocate_lock
```

因为 Python 中所有东西都是对象,所以,其实 PyCharm 并没有错。 threading.Lock 其实只是_thread.Lock 的一个别名。而_thread.Lock 是 C 写的 Python 对象,具体根据系统不同调用系统的信号量

至于 RLock ,看这里 https://github.com/python/cpython/blob/master/Lib/threading.py#L74

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/345311

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX