在iPython笔记本代码中验证PEP8

54

有没有一种简单的方法可以在编写iPython笔记本代码时检查其是否符合PEP8标准?

7个回答

45

确保你已经安装了模块pycodestyleflake8以便检查你的代码是否符合风格指南。然后使用pycodestyle_magic模块(github repo)来启用魔术函数:

pip install flake8 pycodestyle_magic
  • 首先在Jupyter Notebook的单元格中加载魔法命令:

%load_ext pycodestyle_magic

  • 然后使用以下命令打开魔法功能,对每个单元格进行合规性检查:

%pycodestyle_on%flake8_on

具体使用哪个命令取决于你要检查哪个代码风格指南。

enter image description here

若要关闭自动合规性检查,请运行:

%pycodestyle_off%flake8_off


1
重新表述第一句话,很高兴它有帮助。 - Mattijn
1
这是最新的最佳答案。正是我一直在寻找的。 - E.K.
2
我不确定这个答案是否适用于Google Colaboratory。包已经安装好了,但是当我尝试运行%flake8_on%pycodestyle_off时,出现了一个奇怪的错误:TypeError: auto_run_flake8() missing 1 required positional argument: 'result'TypeError: auto_run_pycodestyle() missing 1 required positional argument: 'result' - Taylor D. Edmiston
禁用检查怎么样?我尝试添加了tox.ini文件,但似乎被忽略了。 - Zitrax
1
看起来pycodestyle_magic现在已经不再维护了。 - ignoring_gravity
显示剩余5条评论

15

如果有人需要帮助,我使用以下命令:

conttest "jupyter nbconvert notebook.ipynb --stdout --to script | flake8 - --ignore=W391"

  • conttest将在保存笔记本更改时重新运行
  • flake8 -告诉flake8从stdin中获取输入
  • --ignore=W391 - 这是因为jupyter nbconvert的输出似乎总是有一个"文件末尾的空行",所以我不想让flake8抱怨。

我遇到了一个问题,即markdown单元格(其行长度可能合法地相当长):忽略“ jupyter nbconvert”中的markdown单元格与`--to script`


如果IPython笔记本包含魔法命令,这将导致误报。我建议改用conttest "nbqa flake8 notebook.ipynb --extend-ignore=W391"。这也会忽略Markdown单元格。 - ignoring_gravity

10

使用以下命令为IPython笔记本安装pep8扩展:

%install_ext https://raw.githubusercontent.com/SiggyF/notebooks/master/pep8_magic.py

查看官方文档以获取更多信息。

之后使用%%pep8单元格魔术函数来检查您特定单元格的pep8样式。

请注意,必须将此放置在需要强制执行pep8检查的每个单元格内。

参考此示例


7
install_ext已经被弃用并删除。扩展现在需要在PyPI上发布,并使用pip进行安装。 - Matt
1
pep8已经被弃用,现在需要将扩展程序发布到PyPi上,请参见答案https://dev59.com/uV8e5IYBdhLWcg3wEXBi#47204361或向下滚动。 - Mattijn
我无法让它正常工作,根据@Mattijn的说法,这种方法已不再可行。 - Kambiz
不再可行的答案。 - Echo

3

我建议使用nbQA进行此操作:

pip install -U nbqa flake8
conttest "nbqa flake8 notebook.ipynb"

这样做能够跳过Markdown单元格并且可以稳健地处理IPython魔法方法。

其他回答存在的问题:

  • "jupyter nbconvert"对于魔法方法不够稳健
  • pycodestyle_magic很不幸已经不再维护(最后一次提交是2019年)
  • install_ext已被废弃

免责声明:我是nbQA的作者


1

我喜欢使用black代码检查工具pre-commit git钩子(每次提交时自动进行代码检查)来保持我的笔记本整洁。

pip install pre-commit "black[jupyter]"
# <-- create your .pre-commit-config.yaml
pre-commit install
black {source_file_or_directory}
# your notebooks will be linted whenever you commit now

如需设置.pre-commit-config.yaml的说明,请参阅black文档pre-commit文档


0
你可以包含我的脚本的部分内容(下面有链接),以查看哪些代码行需要特定的PEP8纠正。你也可以独立运行它。
该脚本基于flake8将PEP8注释包含到py文件代码中。 这使得立即跳转到需要样式修正的位置非常容易。
你可以在这里检查: https://github.com/Softerec/PEP8-commenter

1
你好!请写出回答问题的具体代码部分,不要链接。 - Juan Carlos Ramirez

0

如果你想要从代码或程序中解放出来,避免过多关注EPE8,那么请同时安装两个纠错程序。

我们进行安装:

pip install nb_black   
pip install flake8 pycodestyle_magic

将其粘贴到代码开头:

%load_ext nb_black
%load_ext pycodestyle_magic 
%pycodestyle_on 

注意,顺序很重要。


这看起来是一个不错的解决方案。您能详细说明一下每个包在做什么,特别是 nb_black,以及为什么顺序很重要吗? - frederick-douglas-pearce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接