Python中Pycharm pro开发时为什么有些代码没有自动提示但可以执行?

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

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

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

请问这是为什么?


Python中Pycharm pro开发时为什么有些代码没有自动提示但可以执行?

5 回复

Pycharm 需要索引你的安装包才会提示的


这通常是因为PyCharm的代码索引或类型推断没跟上。常见原因和解决办法:

  1. 缺少类型注解 - PyCharm依赖类型信息做提示:
# 没有类型注解时可能没提示
def process_data(data):
    return data.upper()  # 这里data.upper()可能没提示

# 加上类型注解就有提示了
def process_data(data: str) -> str:
    return data.upper()  # 现在会有提示
  1. 动态导入或运行时赋值
# 动态导入会让PyCharm找不到定义
module_name = "os"
module = __import__(module_name)  # module.getcwd()可能没提示

# 改为直接导入
import os
os.getcwd()  # 正常提示
  1. 第三方库未正确索引
  • 确保解释器设置正确:File → Settings → Project → Python Interpreter
  • 重新构建索引:File → Invalidate Caches and Restart
  1. 使用了__getattr__等动态方法
class DynamicClass:
    def __getattr__(self, name):
        return lambda: None

obj = DynamicClass()
obj.some_method()  # 这里不会有自动提示
  1. 检查代码是否在项目根目录下 - 外部文件可能不被索引。

最直接的解决:给变量和函数加上类型注解,用静态导入代替动态导入。

总结:加类型注解,用静态导入。

那为什么 threading 模块下有的可以提示,有的不行呢

pycharm 的类型推断逻辑 参考这个
https://www.jetbrains.com/help/pycharm/2016.3/type-hinting-in-pycharm.html

Lock 是 threading 下的一个类,应该是这个类描述没遵循任何一条规则,所以推断不出来。。

这是因为:

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

python<br>_allocate_lock = _thread.allocate_lock<br>

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

python<br>Lock = _allocate_lock<br>

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

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

回到顶部