在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'.
此插件当前提供两个导入规则:
- DEP401:禁止导入私有模块
- 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包包含业务逻辑,不应从导入 web或data包。在这种情况下,可以添加以下内容 flake8配置文件的规则:
[flake8] disallowed = business/*: web.* business/subpackage/*: data.*
右侧是用于匹配不允许的导入的正则表达式 模块名称(标准化为绝对导入后)。在左手边 side是UNIX样式的模式,用于匹配导入规则所依据的源文件 应用。在
请参阅examples/regex_rule_example文件夹以获取此示例。在
局限性
此工具不捕获对模块上私有命名属性的访问 (通常是一个对象)可以按照上面的方法导入 规则。在
动机
Python不强制进行封装。当这是为用例提供能量的时候 在这里,封装无关紧要,而且使Python非常容易访问 初学者,这意味着开发人员需要更多的规程 大系统(强大的力量带来巨大的责任)。在
因此,Python开发人员通常依赖于隐式命名约定,比如 作为前面的下划线来表示隐藏的内容。但是这可以 只有通过严格的代码审查才能强制执行。对于一个拥有 不同的技能水平,这对于一个大型项目来说是很难实现的。 即使是经验最丰富、意图最好的开发人员也可以 错误,尤其是当软件组件的预期可见性不是 很明显。在
许多编程语言(例如java、C++、C++)为程序员提供了方法。 通过“访问修饰符”控制隐藏的内容和可访问的内容 或“公共”、“私人”和“内部”等关键字。这些保护措施是 由编译器强制执行,但可以通过一些努力来推翻。在创建Packaway是为了提供一种相对简单的实施方法 在模块级别用Python进行封装,这种封装方式不具有侵入性。在
- 项目
标签: