静态Python代码分析器,尝试检查代码中的函数是否为纯函数以及为什么。
项目描述
mr. Proper
静态Python代码分析器,尝试检查代码中的函数是否为纯函数以及为什么。
免责声明:此库非常实验性,有很多边缘情况。mr. Proper标记为纯的函数可能不是纯函数,但它们通常比其他函数更干净。
安装
pip install mr_proper
mr. Proper检查什么
- 该函数没有列入黑名单的调用(如
print
)和黑名单属性访问(如smth.count
); - 该函数不使用全局对象(只有局部变量和函数参数);
- 该函数至少有一个返回;
- 该函数不会修改其参数;
- 该函数没有本地导入;
- 该函数没有禁止类型的参数(如ORM对象);
- 该函数不使用
self
、class
或super
; - 该函数仅调用纯函数。
这份列表并不能完全说明函数是纯函数,有些点颇具争议,但这是一个不错的起点。
示例
控制台使用
# 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
:要求内部调用对于函数纯度必须是纯函数。
代码先决条件
- Python 3.7+;
- 函数完全类型注解;
- 无动态调用(如
getattr(sender, 'send_' + message_type)(message)
)。
贡献
我们欢迎您为我们的项目做出贡献。这很简单
- 创建一个问题报告,报告您发现的错误或建议。等待维护者的批准。
- 创建一个pull request。确保所有检查都是绿色的。
- 如果有任何审阅评论,请修复它们。
- 做得很棒。
以下是一些有用的提示
- 您可以使用
make check
运行所有检查和测试。请在TravisCI之前这样做。 - 我们使用 BestDoctor python风格指南。
- 我们尊重 Django CoC。做软的,不做垃圾。
项目详情
下载文件
下载您平台上的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。
源分布
mr_proper-0.0.7.tar.gz (11.0 kB 查看散列)
构建分布
mr_proper-0.0.7-py3-none-any.whl (11.5 kB 查看散列)