【问题标题】:Decorator for attrs converterattrs 转换器的装饰器
【发布时间】:2020-12-16 21:22:09
【问题描述】:

是否有使用 attrs 转换器的装饰器?

validatordefault 的装饰器,但我看不到 converter 的任何内容。

有可能吗?

我更喜欢将函数作为类内的“方法”,而不是类外的全局函数。装饰器允许这样做:)

验证器的示例 sn-p。

    payload : bytes = attr.ib( default=b'', on_setattr=attr.setters.validate )

    #! NOTE: using attrs validator as a property setter function.
    @payload.validator
    def payload_setter( self, attribute : attr.Attribute, value : bytes ) -> None :
        self.payload_length = len( value )

我想使用转换器做类似的事情。将一些输入字节修剪为上限的示例。

    data : bytes = attr.ib( default=b'', on_setattr=attr.setters.converter )

    #! NOTE: using attrs converter as a property setter function.
    @data.converter
    def data_setter( self, attribute : attr.Attribute, value : bytes ) -> None :
        trimmed_value = value[:10]
        return trimmed_value

【问题讨论】:

    标签: python-attrs


    【解决方案1】:

    目前没有。

    对此进行了一些工作,但有人怀疑这样做是否有意义:https://github.com/python-attrs/attrs/pull/404

    【讨论】:

    • 我读过那个公关。不确定我是否完全理解用例以及它们是否与我的相似。我有一个额外的要求,我省略了,修剪的长度不是固定的,而是由同一类的另一个属性(self.max_length)确定,所以我需要转换器回调来访问实例(类似于验证器装饰器/回调)。
    • 我认为 attrs 现在支持这一点是对的,因为 `attr.setters.convert(instance, attrib, new_value)` 可以访问实例,这是一个新功能。是的?虽然我不确定装饰器是否可用。
    【解决方案2】:

    我就是这样做的,而且效果很好。但是,我将 attrs 用于非常简单的情况,我不能保证这会在更复杂的情况下发挥作用。

    def converter(attribute):
        def decorator(func):
            attribute.converter = func
            return staticmethod(func)
        return decorator
    
    
    @attr.s
    class MyAttrs:
        number = attr.ib()
    
        @converter(number):
        def _convert_to_int(value):
            return int(value)
    
    
    >>> MyAttrs('0')
    MyAttrs(number=0)
    >>> MyAttrs(12.5)
    MyAttrs(number=12)
    

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2010-11-24
      • 1970-01-01
      • 2013-01-16
      • 2021-10-01
      • 2019-12-20
      • 1970-01-01
      • 2018-07-18
      • 2021-04-21
      相关资源
      最近更新 更多