在Python中强制(一些)封装的静态检查器。

packawa的Python项目详细描述


Packaway是一个在Python中实现封装和访问控制的工具 通过执行静态代码分析。在

目前发行版提供了flake8插件。在

安装

要安装:

$ pip install packaway

Flake8插件

要验证是否安装了packaway flake8插件:

^{pr2}$

要整理文件:

$ flake8 example.py
example.py:1:1: DEP401 Importing private name 'package._name'.

此插件当前提供两个导入规则:

  1. DEP401:禁止导入私有模块
  2. DEP501:禁止使用正则表达式模式导入

DEP401:使用下划线的打包规则

模块是否是内部的,由其名称是否具有 前一个下划线。如果是,那么它只在 模块所在的包。类似地,一个函数的名字有一个 下划线仅对在同一模块中的成员“可见”,其中 函数已定义。在

假设项目具有以下结构:

./package
    ./person
        __init__.py
        api.py
        _greeting.py
        _reading.py
    ./office
        __init__.py
        api.py
        _hours.py
        ./_legal
            __init__.py
            api.py
            _compliance.py
        ./_accounting
            __init__.py
            api.py
            _booking.py

可以使用插件捕获以下导入冲突:

./office/api.py:7:1: DEP401 Importing private name 'person._reading'.
./office/api.py:13:1: DEP401 Importing private name 'office._legal._compliance'.
./office/_hours.py:2:1: DEP401 Importing private name 'office._accounting._booking'.
./office/_hours.py:8:1: DEP401 Importing private name 'package.office._legal.api'.
./office/_legal/_compliance.py:8:1: DEP401 Importing private name 'office._accounting._booking'.
./person/_greeting.py:5:1: DEP401 Importing private name 'person._reading._private_name'.
./person/api.py:5:1: DEP401 Importing private name 'person._reading._private_name'.

请参阅examples/package文件夹以获取此示例。在

DEP501:使用正则表达式导入规则

在某些情况下,前面的下划线可能不使用 可能(例如向后兼容性约束)。可以指定导入 使用较低级别的模块名称和模式导入 模式。在

假设项目具有以下结构:

./regex_rule_example
    ./business
        ./subpackage
            __init__.py
            bad.py
    ./data
        __init__.py
        api.py
    ./web
        __init__.py
        api.py

business包包含业务逻辑,不应从导入 webdata包。在这种情况下,可以添加以下内容 flake8配置文件的规则:

[flake8]
disallowed =
    business/*: web.*
    business/subpackage/*: data.*

右侧是用于匹配不允许的导入的正则表达式 模块名称(标准化为绝对导入后)。在左手边 side是UNIX样式的模式,用于匹配导入规则所依据的源文件 应用。在

请参阅examples/regex_rule_example文件夹以获取此示例。在

局限性

此工具不捕获对模块上私有命名属性的访问 (通常是一个对象)可以按照上面的方法导入 规则。在

动机

Python不强制进行封装。当这是为用例提供能量的时候 在这里,封装无关紧要,而且使Python非常容易访问 初学者,这意味着开发人员需要更多的规程 大系统(强大的力量带来巨大的责任)。在

因此,Python开发人员通常依赖于隐式命名约定,比如 作为前面的下划线来表示隐藏的内容。但是这可以 只有通过严格的代码审查才能强制执行。对于一个拥有 不同的技能水平,这对于一个大型项目来说是很难实现的。 即使是经验最丰富、意图最好的开发人员也可以 错误,尤其是当软件组件的预期可见性不是 很明显。在

许多编程语言(例如java、C++、C++)为程序员提供了方法。 通过“访问修饰符”控制隐藏的内容和可访问的内容 或“公共”、“私人”和“内部”等关键字。这些保护措施是 由编译器强制执行,但可以通过一些努力来推翻。在

创建Packaway是为了提供一种相对简单的实施方法 在模块级别用Python进行封装,这种封装方式不具有侵入性。在

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

推荐PyPI第三方库


热门话题
java JavaFX 2.2字体呈现有问题   java如何从html文本中获取img url   java Spring数据REST存储库404   java从jar文件复制目录   java Spring引导无法满足自定义JPA请求   hadoop将值从Java操作传递到Oozie工作流中的下一个Java操作   java如何修复“Android资源链接失败”?使用NavigationView和片段   c3p0数据源的java独立日志文件   java如何从BufferImage生成图像   java JDBC SQL SELECT查询和方法运行不正常   从Android Studio中的java类获取资源   java EclipseLink MySQLSyntaxErrorException找不到错误   java我应该如何在mysql数据库中自动存储我的gps坐标?   ApacheFlex应该为BlazeDS实现Java DTO的可序列化   java为什么我的组件彼此相邻?   java在dao层中的多种方法   具有可配置凭据的java Spring WebServiceClient   java如何在Spring Boot中获取每个请求中的当前用户?