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开发时为什么有些代码没有自动提示但可以执行?
Pycharm 需要索引你的安装包才会提示的
这通常是因为PyCharm的代码索引或类型推断没跟上。常见原因和解决办法:
- 缺少类型注解 - PyCharm依赖类型信息做提示:
# 没有类型注解时可能没提示
def process_data(data):
return data.upper() # 这里data.upper()可能没提示
# 加上类型注解就有提示了
def process_data(data: str) -> str:
return data.upper() # 现在会有提示
- 动态导入或运行时赋值:
# 动态导入会让PyCharm找不到定义
module_name = "os"
module = __import__(module_name) # module.getcwd()可能没提示
# 改为直接导入
import os
os.getcwd() # 正常提示
- 第三方库未正确索引:
- 确保解释器设置正确:File → Settings → Project → Python Interpreter
- 重新构建索引:File → Invalidate Caches and Restart
- 使用了
__getattr__等动态方法:
class DynamicClass:
def __getattr__(self, name):
return lambda: None
obj = DynamicClass()
obj.some_method() # 这里不会有自动提示
- 检查代码是否在项目根目录下 - 外部文件可能不被索引。
最直接的解决:给变量和函数加上类型注解,用静态导入代替动态导入。
总结:加类型注解,用静态导入。
那为什么 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#L33python<br>_allocate_lock = _thread.allocate_lock<br>
* 还有这里: https://github.com/python/cpython/blob/master/Lib/threading.py#L72python<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

