跳转到主要内容

一个用于检查类属性顺序的flake8扩展

项目描述

flake8-class-attributes-order

Build Status Maintainability Test Coverage PyPI - Python Version

一个用于flake8的报告,用于报告错误的类属性顺序和类级别逻辑。

验证器可以提取类属性类型:文档字符串、属性、嵌套类、GLOBAL_VAR等。如果检测到Django模型字段,验证器可以检测字段是否链接到另一个表(外键、通用键等)。

解决每个属性类型后,验证器检查属性顺序。

默认配置检查以下属性顺序

  • __new__
  • __init__
  • __post_init__
  • 其他魔术方法
  • @property
  • @staticmethod
  • @classmethod
  • 其他方法
  • 私有方法

如果顺序被破坏,验证器将报告。

除了方法之外,验证器还会检查其他属性方法:文档字符串、嵌套类、常量、属性等。

此外,验证器还会检查类是否有类级别逻辑,如果有则报告。以下是一个例子

class PhoneForm(forms.Form):
    phone = forms.CharField(17, label='Телефон'.upper())

    # this should happen in __init__!
    phone.widget.attrs.update({'class': 'form-control phone'})

安装

pip install flake8-class-attributes-order

配置

严格模式

还有一个预先配置的顺序,对私有子类型更加严格

  • __new__
  • __init__
  • __post_init__
  • 其他魔术方法
  • @property
  • @staticmethod
  • @classmethod
  • 其他方法
  • 私有 @property
  • 私有 @staticmethod
  • 私有 @classmethod
  • 其他私有方法

要启用严格验证,请设置您的配置文件中的标志

[flake8]
use_class_attributes_order_strict_mode = True

手动顺序配置

可以通过 class_attributes_order 配置设置手动配置顺序。

例如,如果您希望将 class Meta 放在常量和字段之后

[flake8]
class_attributes_order =
    field,
    meta_class,
    nested_class,
    magic_method,
    property_method,
    static_method,
    class_method,
    method,
    private_method

可配置选项

选项 描述 回退到*
meta_class class Meta: (例如,在Django项目中) nested_class
nested_class 其他嵌套类 None*
常量 SOME_CONSTANTS 字段
outer_field some = models.ForeignKey等。 字段
字段 其他字段 None
__new__ __new__ 魔术方法
__init__ __init__ 魔术方法
__post_init__ __post_init__ 魔术方法
__str__ __str__ 魔术方法
魔术方法 其他魔术方法 方法
保存 def save(...) 方法
删除 def delete(...) 方法
属性方法 @property/@cached_property等。 方法
私有属性方法 @property/@cached_property带有_ 属性方法
静态方法 @staticmethod 方法
私有静态方法 @staticmethod以_开头 静态方法
类方法 @classmethod 方法
私有类方法 @classmethod以_开头 类方法
私有方法 其他以_开头的方法 方法
方法 其他方法 None

* 如果未提供,将使用其超类型顺序

** 如果未定义,则将在验证期间忽略这些基类型及其所有子类型(除非已定义)。建议至少设置 nested_classfieldmethod

您可以选择配置的详细程度。例如,您可以定义每个受支持的魔术方法的顺序(如__new____str__等),或将magic_method设置为允许它们之间的任何顺序,甚至只需使用method

示例

DEBUG = True


class User:
    def fetch_info_from_crm(self):
        pass

    LOGIN_FIELD = 'email'  # wtf? this should be on top of class definition!


class UserNode:
    class Meta:
        model = User

    if DEBUG:  # not great idea at all
        def is_synced_with_crm(self):
            pass

用法

$ flake8 test.py
test.py:5:5: CCE001 User.fetch_info_from_crm should be after User.LOGIN_FIELD
test.py:15:5: CCE002 Class level expression detected model UserNode, line 15

在Python 3.7.x和flake8 3.7.5上进行了测试。

错误代码

错误代码 描述
CCE001 类属性顺序错误(XXX应在YYY之后
CCE002 检测到类级别表达式

贡献

我们非常希望您为我们的项目做出贡献。这很简单

  • 创建一个问题,报告您发现的错误或您拥有的建议。等待维护者的批准。
  • 创建一个pull请求。确保所有检查都是绿色的。
  • 如果有任何审查评论,请修复它们。
  • 保持优秀。

以下是一些有用的提示

项目详情


下载文件

下载您平台上的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

flake8_class_attributes_order-0.1.3.tar.gz (10.3 KB 查看哈希值

上传于 源代码

构建分发

flake8_class_attributes_order-0.1.3-py3-none-any.whl (9.4 kB 查看哈希)

上传于 Python 3

由以下支持