python的静态函数纯度分析。
flython的Python项目详细描述
flython仍处于不稳定的开发阶段。许多功能不能完美地工作(如果有的话),而且界面仍在调整和使用中。错误报告、问题、反馈、修复和其他贡献都非常感谢–只要打开一个issue或pull request!
关于
python是一种令人难以置信的动态语言。虽然这是它最大的优势之一,但它也往往会给希望在严格的功能范例中编程的工程师带来困难。flython提供了静态分析编译的cpython字节码的工具,可以近乎完美地防止状态性、副作用、变异和其他功能崩溃源。
Flython的设计灵感来源于(并仿照)mypy。如果您曾经使用过类似的静态分析工具,那么将flython集成到您的工作流中会感到熟悉和自然。
示例
安装flython最简单的方法是使用pip
:
$ pip install flython
当您的代码在功能上是纯的时,flython将保持不可见:
$ flython pure.py
如果不是,弗利通会警告你。考虑下面的模块,impure.py
:
defmodify_object(target):"""Mutate target."""target.foo="bar"deltarget.bazdefmodify_object_sneaky(target):"""Mutate target in a hard-to-catch way."""setter,deleter=setattr,delattrsetter(target,"foo","bar")deleter(target,"baz")# Create some mutable objects:my_list=[*range(3)]my_set={iforiinrange(3,6)}my_dict=dict((("six",6),("seven",7),("eight",8)))# Mutate those objects:my_list[0]="zero"my_set-=my_setdelmy_dict["eight"]
当我们运行flython时,它会捕获相当多的杂质:
$ flython impure.py
Attempt to store value 'bar' to variable attribute target.foo. (impure.py, line 4)
Attempt to delete variable attribute target.baz. (impure.py, line 5)
Attempt to store value 'zero' to contained item my_list[0]. (impure.py, line 23)
Attempt to modify variable. Use normal assignment (my_set = my_set - my_set) instead of augmented assignment (my_set -= my_set). (impure.py, line 24)
Attempt to delete contained item my_dict['eight']. (impure.py, line 25)
不过,使用--strict
可以捕获all的问题:
$ flython impure.py --strict
Attempt to store value 'bar' to variable attribute target.foo. (impure.py, line 4)
Attempt to delete variable attribute target.baz. (impure.py, line 5)
Attempt to load dynamic function 'setattr'. (impure.py, line 11)
Attempt to load dynamic function 'delattr'. (impure.py, line 11)
Attempt to use mutable built-in type 'list'. (impure.py, line 18)
Attempt to use mutable built-in type 'set'. (impure.py, line 19)
Attempt to use mutable built-in type 'dict'. (impure.py, line 20)
Attempt to store value 'zero' to contained item my_list[0]. (impure.py, line 23)
Attempt to modify variable. Use normal assignment (my_set = my_set - my_set) instead of augmented assignment (my_set -= my_set). (impure.py, line 24)
Attempt to delete contained item my_dict['eight']. (impure.py, line 25)
功能
命令行工具
$ flython MODULE [ MODULE ... ]
使用模块列表直接执行flython
包以静态分析它们。它接受一些基本选项:
$ flython --help
Static functional purity analysis for Python.
Options:
--no-dynamic Don't allow "breakpoint" (Python 3.7+), "delattr", "eval", "exec", "globals", "locals", or "setattr".
--no-io Don't allow "input", "open", or "print".
--no-mutables Don't allow mutable built-in types.
--no-raise Don't allow "raise" statements.
--skip-imports Don't check imports.
--strict Same as --no-dynamic --no-io --no-mutables --no-raise.
Flython评论
...# flython: ignore
指示Flython应消除此线上发生的任何错误。
注意,这并不是沉默之后的进口。如果用户不希望对导入进行分析,则应跳过使用# flython: skip
的导入。
...# flython: skip
指示flython不应检查此行定义的任何新代码对象。这包括导入、类定义、函数定义、生成器表达式或list
/dict
/set
理解。
编程接口
flython.main(*modules: str, **options: bool) -> Generator[Union[OSError, SyntaxError], None, None]
main
函数接受任意数量的字符串文件路径,并生成与命令行接口报告的对象相同的Exception
对象。
要求
flython正式支持linux上的cpython 3.4+。它还试图保持与pypy 3.5和cpython3.5+的所有开发版本(包括不稳定的分支)的兼容性。它没有外部依赖关系。
对于flython开发工作,建议使用python 3.6+,以及requirements.txt
中包的最新版本。
贡献
欢迎投稿!有关详细信息,请参见CONTRIBUTING.md
。
麻省理工学院的执照
版权所有©2018 Gary Brandt Bucher,II.
兹免费准许任何人取得 本软件和相关文档文件(“软件”),用于处理 不受限制的软件,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或销售副本 以及允许向其提供软件的人员 因此,必须满足以下条件:
上述版权公告及本许可公告须包括在 软件的拷贝或大部分。
本软件按“原样”提供,无任何形式的保证,明示或 默示的,包括但不限于适销性保证, 适合特定目的和不侵权。在任何情况下 作者或版权所有者应对任何索赔、损害或其他 责任,无论是在合同诉讼、侵权诉讼或其他诉讼中, 不属于或与本软件有关,或使用或与本软件的其他交易有关。 软件。