跳转到主要内容

特殊情况的先进描述符。

项目描述

高级描述符

https://github.com/python-useful-helpers/advanced-descriptors/workflows/Python%20package/badge.svg Documentation Status https://img.shields.io/pypi/v/advanced-descriptors.svg https://img.shields.io/pypi/pyversions/advanced-descriptors.svg https://img.shields.io/pypi/status/advanced-descriptors.svg https://img.shields.io/github/license/python-useful-helpers/advanced-descriptors.svg https://img.shields.io/badge/code%20style-black-000000.svg

此包包括特殊情况的辅助工具

  • SeparateClassMethod - 允许同时存在具有相同名称的classmethod和普通方法。

  • AdvancedProperty - 具有设置类范围getter的属性的属性。

  • LogOnAccess - 在成功get/set/delete或失败时进行日志记录的属性。

SeparateClassMethod

此描述符可以使用标准装饰器语法设置。创建具有参数的实例

def imeth(instance):
    return instance.value

def cmeth(owner):
    return owner.value

class Target(object):
    value = 1

    def __init__(self):
        self.value = 2
    getval = advanced_descriptors.SeparateClassMethod(
        imeth, cmeth
    )

创建作为装饰器包装的实例

class Target(object):
    value = 1

    def __init__(self):
        self.value = 2

    @advanced_descriptors.SeparateClassMethod
    def getval(self):
        return self.value

    @getval.class_method
    def getval(cls):
        return cls.value

只有方法和只有classmethod的情况是无用的:在这种情况下应使用方法本身和@classmethod

AdvancedProperty

在需要类getter的情况下,除了普通属性API之外,应使用此描述符。如果还需要类范围的setter和deleter,则应在元类中使用标准属性。

使用示例

  1. 除了常规属性API之外

class Target(object):
    _value = 777

    def __init__(self):
        self._value = 42

    @advanced_descriptors.AdvancedProperty
    def val(self):
        return self._value

    @val.setter
    def val(self, value):
        self._value = value

    @val.deleter
    def val(self):
        self._value = 0

    @val.cgetter
    def val(cls):
        return cls._value
  1. 还可以使用类的getter方法来获取实例

class Target(object):
    _value = 1

    val = advanced_descriptors.AdvancedProperty()

    @val.cgetter
        def val(cls):
            return cls._value

LogOnAccess

这种属性的特殊情况在需要以类似方式记录许多属性而无需编写大量代码的情况下很有用。

基本API符合property规范,但还可以自定义记录器、日志级别和日志条件。

使用示例

  1. 简单用法。默认全部。如果实例中存在名称为loggerlog的记录器,则重用实例中的记录器,否则使用内部的advanced_descriptors.log_on_access记录器

import logging

class Target(object):

    def init(self, val='ok')
        self.val = val
        self.logger = logging.get_logger(self.__class__.__name__)  # Single for class, follow subclassing

    def __repr__(self):
        return "{cls}(val={self.val})".format(cls=self.__class__.__name__, self=self)

    @advanced_descriptors.LogOnAccess
    def ok(self):
        return self.val

    @ok.setter
    def ok(self, val):
        self.val = val

    @ok.deleter
    def ok(self):
        self.val = ""
  1. 与类的全局记录器一起使用

class Target(object):

  def init(self, val='ok')
      self.val = val

  def __repr__(self):
      return "{cls}(val={self.val})".format(cls=self.__class__.__name__, self=self)

  @advanced_descriptors.LogOnAccess
  def ok(self):
      return self.val

  @ok.setter
  def ok(self, val):
      self.val = val

  @ok.deleter
  def ok(self):
      self.val = ""

  ok.logger = 'test_logger'
  ok.log_level = logging.INFO
  ok.exc_level = logging.ERROR
  ok.log_object_repr = True  # As by default
  ok.log_success = True  # As by default
  ok.log_failure = True  # As by default
  ok.log_traceback = True  # As by default
  ok.override_name = None  # As by default: use original name

测试

该包 advanced-descriptors 的主要测试机制是使用 tox。可以通过 tox -l 收集可用环境。

CI系统

对于CI/CD,使用GitHub actions

GitHub actions:用于检查:PEP8、pylint、bandit、安装可能性以及单元测试。

项目详情


下载文件

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

源代码分发

advanced-descriptors-4.0.3.tar.gz (18.1 kB 查看哈希值)

上传时间 源代码

构建分发

advanced_descriptors-4.0.3-py3-none-any.whl (16.9 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面