在使用Python的Black包运行我们的lint检查时,会出现以下错误:
ImportError: 无法从'click'导入名称'_unicodefun' (/Users/robot/.cache/pre-commit/repo3u71ccm2/py_env-python3.9/lib/python3.9/site-packages/click/init.py)`
通过研究,我发现以下相关问题:
我该如何解决这个问题?这是linter的误报吗?我需要修改我的代码吗?
在使用Python的Black包运行我们的lint检查时,会出现以下错误:
ImportError: 无法从'click'导入名称'_unicodefun' (/Users/robot/.cache/pre-commit/repo3u71ccm2/py_env-python3.9/lib/python3.9/site-packages/click/init.py)`
通过研究,我发现以下相关问题:
我该如何解决这个问题?这是linter的误报吗?我需要修改我的代码吗?
这个问题已经被Black 22.3.0修复了。在此之前的版本将无法与click 8.1.0一起使用。
与 click 8.1.0 不兼容(ImportError:无法从 'click' 导入名称 '_unicodefun')#2964
例如:black.yml
python-version: 3.8
- name: install black
run: |
- pip install black==20.8b1
+ pip install black==22.3.0
- name: run black
run: |
black . --check --line-length 100
https://github.com/Clinical-Genomics/cgbeacon2/pull/221/files
为解决此问题,请通过pip install --upgrade click==8.0.2
将 click
锁定到最新版本。
如果您在pre-commit hook的YAML中使用black
,您可以更新pre-commit文件(通常为.pre-commit-config.yaml
)以引用更近期版本的black(>=22.3.0),例如:
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
exclude: ^dist/
如果YAML文件将black
本身固定在特定版本上,那么运行pip安装新版本的black
并不足以满足命令行pre-commit钩子的要求...,而pre-commit
默认会这样做。另请参见Black的GitHub问题跟踪器。
pre-commit clean
pre-commit autoupdate
这里有几个常见的用例:
.pre-commit-config.yaml
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
如果问题在pre-commit阶段持续存在,很可能是因为旧版本被缓存了(正如这里所建议的)。运行
pre-commit clean
然后pre-commit install
进行重置。
pyproject.toml
[tool.poetry.dev-dependencies]
black = {version = "^22.3.0", allow-prereleases = true}
[tool.black]
# https://github.com/psf/black
target-version = ["py39"]
line-length = 120
color = true
需要在pyproject.toml
文件上方使用
Makefile
#* Poetry
.PHONY: poetry-download
poetry-download:
curl -sSL https://install.python-poetry.org | $(PYTHON) -
.PHONY: pre-commit-install
pre-commit-install:
poetry run pre-commit install
#* Formatters
.PHONY: codestyle
codestyle:
poetry run black --config pyproject.toml ./
.pre-commit-config.yaml
default_language_version:
python: python3.9
default_stages: [commit, push]
repos:
- repo: local
hooks:
- id: black
name: black
entry: poetry run black --config pyproject.toml
types: [python]
language: system
以下链接详细描述了依赖冲突的情况。
您需要在additional_dependencies部分为黑色修订版20.8b1指定一个8.0.2的点击版本(能够清理python27代码),例如:
- repo: https://github.com/psf/black
rev: 20.8b1
hooks:
- id: black
name: Blacken python source
additional_dependencies: ["click==8.0.2"]
如果您正在使用黑色格式化Python 2.7代码,并且由于不支持放弃Python 2.7,因此无法进行黑色更新,请尝试安装click==8.0.4。
以下是我为遗留的Python 2.7项目使用的GitHub操作的.github/workflows/black.yml
。
name: Black check
on: [pull_request]
jobs:
black-check:
runs-on: ubuntu-22.04
name: Black
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@master
with:
python-version: 3.8
- name: install black
run: |
pip install click==8.0.4 black==21.9b0
- name: run black
run: |
black . -t py27 --check
black
版本修复了,因此即使是“当时最新版本”也不是一个明智的猜测。 - MisterMiyagi