3

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

有 and 的装饰器validatordefault但我看不到converter.

可能吗?

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

验证器的示例代码段。

    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
4

2 回答 2

0

我就是这样做的,而且效果很好。但是,我将 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)
于 2021-06-01T13:42:54.253 回答
0

目前没有。

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

于 2020-08-28T04:47:39.607 回答