数据科学家提高Python代码质量指南

数据科学家提高Python代码质量指南

如今,数据科学家在部署机器学习模型的生产环境中扮演着越来越重要的角色。这意味着我们需要能够像软件工程师一样编写符合生产标准的Python代码。

在本文中,我想介绍一些关键的工具和包,可以帮助你创建具有生产价值的代码。如果你想了解更多关于数据科学的相关内容,可以阅读以下这些文章:
苹果面试流程:数据科学家的完整指南
每个数据科学家都应该知道的关于回归的三个简单的事情
5个ChatGPT插件,让你领先于99%的数据科学家!
数据科学初学者必备的7个备忘单!

代码检查工具

代码检查工具是一种能够捕捉小错误、格式错误和奇怪的设计模式的工具,这些问题可能导致运行时问题和意外的输出。

在Python中,我们有PEP8,它为我们提供了全局的代码风格指南。Python中存在许多遵循PEP8的代码检查工具,但我更喜欢使用flake8。

Flake8

Flake8实际上是Pyflakes, pycodestyle和McCabe检测包的组合。它可以检查错误、代码质量问题,并强制执行PEP8标准。

安装flake8,可以使用命令pip install flake8,然后通过flake8来使用它。实际上就是这么简单!

例如,假设我们在flake8_example.py文件中有一个add_numbers函数:

def add_numbers(a,b):
    result = a+  b
    return result

print(add_numbers(5, 10))

要对这个文件上调用flake8,我们执行flake8 flake8_example.py,输出如下所示:

图片由作者提供

Flake8检测到了几个样式错误,我们应该根据PEP8对其进行修正。

请参阅此处获取有关flake8的更多信息以及如何根据你的需求进行自定义https://flake8.pycqa.org/en/latest/

代码格式化工具

概述

代码检查工具通常只告诉你代码存在什么问题,但并不主动修复它。代码格式化工具可以修复你的代码,帮助加快工作流程,确保你的代码符合代码风格指南,并使它对其他人来说更具可读性。

isort

issort包按照PEP8中指定的所需顺序对导入进行排序。可以通过pip install isort轻松安装。

导入应该写在单独的行上:

# Correct
import pandas
import numpy

# Incorrect
import pandas, numpy

它们也应按以下顺序分组:

  • 标准库(例如sys)
  • 相关第三方(如pandas)
  • 本地库(例如,来自repo中其他文件的函数)
# Correct
import math
import os
import sys

import pandas as pd

# Incorrect
import math
import os
import pandas as pd
import sys

最后,从包中导入的文件需要按字母顺序排列:

# Correct
from collections import Counter, defaultdict

# Incorrect
from collections import defaultdict, Counter

下面的命令展示如何从终端运行issort:

# Format imports in every file
isort .

# Format in specific file
isort <file_name.py>

想了解更多关于isort的信息,请访问他们的网站https://pycqa.github.io/isort/

Black

Black根据它自己的样式指南(PEP8的子集)重新格式化代码。请参阅此处了解Black在格式化时遵循的指南。

要安装black,只需运行pip install black,并在文件black上调用它。

下面是一个名为black_example.py文件的示例:

# Before running black 
def   add_numbers  (  x, y ) :

    result= x  +y
    return result

然后我们运行black black_example.py:

# After running black
def add_numbers(x, y):
    result = x + y
    return result

终端的输出也会像这样:

图片由作者提供

要获取更多信息以及如何自定义你的Black代码格式化工具,请访问它们的主页https://black.readthedocs.io/en/stable/index.html#

单元测试

概述

单元测试提供了一种结构化的格式,以确保你的代码按照预期进行操作。它们测试代码的小部分,如函数和类,以验证它们是否按预期进行操作。测试设置非常简单,可以节省你数小时的调试时间,因此强烈建议数据科学家进行单元测试。

PyTest

PyTest是最受欢迎的单元测试框架,与Python的原生单元测试包并列,可以通过pip install Pytest轻松安装。

要使用PyTest,我们首先需要一个可以测试的函数。让我们回到我们的add_numbers函数,它位于一个名为pytest_example.py的文件中:

def add_numbers(x, y):
    result = x + y
    return result

现在,在一个名为test_pytest_example.py的单独文件中,我们编写相应函数的单元测试:

from pytest_example import add_numbers

def test_add_numbers():
  assert add_numbers(5, 13) == 18

要运行这个测试,我们只需执行pytest test_pytest_example.py:

图片由作者提供

如你所见,我们的测试通过了!

如果你想要一个关于pytest和单元测试的更详细和全面的教程,请查看我之前关于这个主题的帖子https://towardsdatascience.com/debugging-made-easy-use-pytest-to-track-down-and-fix-python-code-ecbad62057b8

类型检查器

概述

我们将讨论的最后一个主题是类型检查,不是指键盘类型!Python是一种动态语言,这意味着它不会对其变量强制执行严格的类型。一个变量x,在同一代码中可以是整数和字符串。然而,这可能会产生问题,并导致意想不到的错误。因此,有一些工具可以使Python更像一种静态类型语言。

Mypy

通过使用包mypy,我们可以确保变量和函数具有正确的预期类型。这个包检查输入和输出是否符合所需的类型。

例如,对于add_numbers函数,我们期望输入和输出都是浮点数。这可以在函数中指定:

def add_numbers(x: float, y: float) -> float:
    result = x + y
    return result

print(add_numbers(10, 10))
print(add_numbers("10", "10"))

现在,假设我们将以下参数传递给函数并打印结果:

print(add_numbers(10, 10))
print(add_numbers("10", "10"))

输出看起来像这样:

print(add_numbers(10, 10))
>>> 20

print(add_numbers("10", "10"))
>>> 1010

我们看到第一个输出是我们所期望的,但第二个不是。这是因为我们传入了两个str类型,但是python解释器并没有报错,因为python是一种动态语言。

我们可以使用mypy来捕获这些错误并避免任何后续错误。为此,调用mypy为mypy。所以,对于这个例子,我们执行mypy mypy_example.py:

图片由作者提供

正如我们所看到的,mypy已经发现第6行中指定的参数是str,而函数期望的是float。

如果你想要一个关于mypy和类型检查的更详细和全面的教程,请查看我之前关于这个主题的帖子https://towardsdatascience.com/a-data-scientists-guide-to-python-typing-boosting-code-clarity-194371b4ef05

需要什么?

总而言之,你可能会想,为什么我们需要所有这些工具?好吧,所有这些工具可以使你的Python代码具有以下特点:

  • 可读性:你的代码对其他开发人员和数据科学家来说变得更直观和易读。这有助于更好地合作和更快地交付。
  • 健壮性:代码不容易出错,也不容易引入错误,尤其是使用单元测试时。
  • 更容易识别Bug:通过使用代码检查工具和测试,我们可以检测到代码中的任何不一致和异常结果,从而减少在生产环境中出现代码错误的风险。

你可以在这里查看本文中使用的完整代码https://github.com/egorhowell/Medium-Articles/tree/main/Software%20Engineering%20/code-quality-example?source=post_page—–21660ecea97d

感谢阅读。你还可以订阅我们的YouTube频道,观看大量大数据行业相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/

原文作者:Egor Howell
翻译作者:Dou
美工编辑:过儿
校对审稿:Chuang
原文链接:https://towardsdatascience.com/a-data-scientists-guide-to-improving-python-code-quality-21660ecea97d