修改blackd源码,实现 black + isort

简述

本文是为了 Pycharm 中使用isort不方便的问题,所做的一些尝试
主要为:在 BlackConnect插件 + blackd进程 的基础上,在blackd源码中加入isort处理逻辑。

需要最新方案的可以直接看第二版 补充
第一版 在本篇文章下方
理解思路的可以先看第一版,再看第二版

vscode安装完插件可以很方便配置,可以参考我的文章 pycharm/vscode 配置black和isort

第二版

在第一版的使用中发现一些问题

  1. black依赖multidict在Python3.12中安装需要进行源码编译,Windows中需要安装MSVC才能编译源码包,截止2023/12/21,官方已修复但尚未发布新版本Issues #887: Build wheels for Python 3.12
    临时解决: 换用3.11
  2. clone black项目太大,除了blackd其他的均未使用:
    解决: 只使用blackd源码,这是第二版的主要目的

主要逻辑

摘出blackd源码
把必要代码整合为单个文件blackd.py
只安装必要依赖,使用单个源码文件blackd.py启动blackd进程

具体步骤

  1. 摘出blackd源码
    复制出black项目中的src/blackd文件夹,主要有以下三个文件
    __init__.py
    __main__.py
    middlewares.py
    __init__.py 文件中使用aiohttp创建了一个http server,是提供服务的主要代码
    __main__.py 文件用于python -m 模块名使用的,参见__main__,可以忽略
    middlewares.py 文件提供了一个cors方法来创建中间件,主要是构造Response和支持跨域访问
  2. 整合为单个文件blackd.py
    主要代码为__init__.py和middlewares.py,把middlewares.py中的代码复制到__init__.py中
  3. isort格式化逻辑调整
    在最后的__main__方法中,新增一个isort配置字典,known_first_party中需要加入项目包名或者项目中的模块名

这个步骤是因为isort方法启动目录不在项目中,无法自动识别项目第一级模块名,需要手动填入
如需其他配置自行修改isort_config字典的值即可,参考isort相关文档

isort_config = dict(
    multi_line_output=3,
    known_first_party=[],
)

随后在中间req_str = req_str[first_newline_position:]后面和前几行if的同级位置上,加入isort处理逻辑

        req_str = isort.code(
            req_str,
            line_length=line_length,
            **isort_config,
        )
  1. 启动进程
# 创建python环境(自行解决)

# 必要依赖
pip install black isort aiohttp

# 启动进程
python blackd.py
  1. 配置Pycharm的BlackConnect
    根据需要配置,略

补充

也可以跳过前3个步骤,直接使用修改后的blackd.py,再按照4、5步骤操作

第一版

目的

在pycharm中使用isort格式化python import代码很不方便,写代码时blackConnect插件使用http请求调用blackd服务进行格式化代码,在 blackd 服务中添加 isort 格式化代码的逻辑来达到 black + isort的 效果

同样原理,使用blackd的格式化方式都可以根据本教程实现,未使用blackd的话也可以参考该思路修改black源码实现。

主要逻辑

  1. 本机clone black
  2. 修改blackd中返回相应前的结果代码,使用isort格式化代码
  3. 使用源码启动blackd进程

具体步骤

  1. 打开github的black项目,fork,在电脑上clone项目。

也可以直接clone black项目到本机,主要只是为了使用black项目源码

  1. 根据Black DEVELOPMENT Contributing,安装依赖,主要步骤

开发black项目建议使用Python 3.12,可以看下原文:
We now have a scripts/release.py script to help with cutting the release PRs.
python3 scripts/release.py --help is your friend.
release.py has only been tested in Python 3.12 (so get with the times )

这里省略了创建虚拟环境的步骤,按照自己的习惯来

pip install -r test_requirements.txt
pip install -e .[d]
pre-commit install
  1. 安装其他依赖
pip install isort aiohttp
  1. 修改代码文件src/blackd/__init__.py:179,在return web.Response前加入isort格式化代码的逻辑:

multi_line_output 是isort的多行代码换行方式
记得在代码文件开始位置import isort

        formatted_str = isort.code(
            formatted_str,
            profile="black",
            line_length=line_length,
            multi_line_output=3,
        )
  1. 使用源码启动blackd进程,在项目目录中执行以下命令
python -m src.blackd

补充

后续打包步骤可以参考black文档中使用Github Action打包:cutting-a-release

你可能感兴趣的:(pycharm,python,black,isort)