跳转到主要内容

静态Python代码分析器,尝试检查代码中的函数是否为纯函数以及为什么。

项目描述

mr. Proper

Build Status PyPI version Maintainability Test Coverage

静态Python代码分析器,尝试检查代码中的函数是否为纯函数以及为什么。

Have fun with mr Clean

免责声明:此库非常实验性,有很多边缘情况。mr. Proper标记为纯的函数可能不是纯函数,但它们通常比其他函数更干净。

安装

pip install mr_proper

mr. Proper检查什么

  1. 该函数没有列入黑名单的调用(如print)和黑名单属性访问(如smth.count);
  2. 该函数不使用全局对象(只有局部变量和函数参数);
  3. 该函数至少有一个返回;
  4. 该函数不会修改其参数;
  5. 该函数没有本地导入;
  6. 该函数没有禁止类型的参数(如ORM对象);
  7. 该函数不使用 selfclasssuper
  8. 该函数仅调用纯函数。

这份列表并不能完全说明函数是纯函数,有些点颇具争议,但这是一个不错的起点。

示例

控制台使用

    # test.py
    def add_one(n: int) -> int:
        return n + 1

    def print_amount_of_users(users_qs: QuerySet) -> None:
        print(f'Current amount of users is {users_qs.count()}')
$ mr_propper test.py
add_one is pure!
print_amount_of_users is not pure because of:
    it uses forbidden argument types (QuerySet)
    it calls not pure functions (print)
    it has no return

Python代码示例中的使用

>>> import ast
>>> from mr_propper.utils import is_function_pure
>>> funcdef = ast.parse('''
    def add_one(n: int) -> int:
        return n + 1
''').body[0]
>>> is_function_pure(funcdef)
True
>>> is_function_pure(funcdef, with_errors=True)
(True, [])

参数

CLI界面

  • filepath:要检查的.py文件路径(目前不支持目录);
  • --recursive:要求内部调用对于函数纯度必须是纯函数。

代码先决条件

  1. Python 3.7+;
  2. 函数完全类型注解;
  3. 无动态调用(如 getattr(sender, 'send_' + message_type)(message))。

贡献

我们欢迎您为我们的项目做出贡献。这很简单

  1. 创建一个问题报告,报告您发现的错误或建议。等待维护者的批准。
  2. 创建一个pull request。确保所有检查都是绿色的。
  3. 如果有任何审阅评论,请修复它们。
  4. 做得很棒。

以下是一些有用的提示

项目详情


下载文件

下载您平台上的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源分布

mr_proper-0.0.7.tar.gz (11.0 kB 查看散列)

上传时间

构建分布

mr_proper-0.0.7-py3-none-any.whl (11.5 kB 查看散列)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面