python的静态函数纯度分析。

flython的Python项目详细描述


Flython

latest versionlatest release datebuild statusissues


flython仍处于不稳定的开发阶段。许多功能不能完美地工作(如果有的话),而且界面仍在调整和使用中。错误报告、问题、反馈、修复和其他贡献都非常感谢–只要打开一个issuepull 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.

兹免费准许任何人取得 本软件和相关文档文件(“软件”),用于处理 不受限制的软件,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或销售副本 以及允许向其提供软件的人员 因此,必须满足以下条件:

上述版权公告及本许可公告须包括在 软件的拷贝或大部分。

本软件按“原样”提供,无任何形式的保证,明示或 默示的,包括但不限于适销性保证, 适合特定目的和不侵权。在任何情况下 作者或版权所有者应对任何索赔、损害或其他 责任,无论是在合同诉讼、侵权诉讼或其他诉讼中, 不属于或与本软件有关,或使用或与本软件的其他交易有关。 软件。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java CXF和授权   java在网站中部署使用swing创建的表单   java为什么getHeaderField()返回一个字符串,其中getHeaderFields()返回HttpUrlConnection中的Map<String,List<String>>   java如何检测恶意数据包?   webview中的java网页为空   java SWT图像资源,用于将我的所有图像存储在一个位置   java计算数组的最大长度,使平均值小于给定值   java“发件人电话号码无效”和美国号码   将Swing组件作为内容的自定义Java工具提示不会显示   在并发HashMap中重新灰化期间的java检索   Java 7和Tomcat 7.0.64 ClassFormatException:常量池中的字节标记无效   使用JUnit的java assertNull因NullPointerException失败   java内存中的文件是否与文件系统中的文件大小相同?   循环内实例化的类型的java注入依赖项