【问题标题】:attr.ib ignores value parameterattr.ib 忽略值参数
【发布时间】:2020-02-27 03:39:06
【问题描述】:

attr.ib 采用 repr 参数,该参数可能是布尔型或可调用的。

要覆盖属性值的格式,请传递一个可调用的,它接受单个值并返回一个字符串。请注意,生成的字符串按原样使用,即直接使用它而不是调用repr()(默认值)。

传递datetime.datetime.fromisoformat()时似乎不是这样:

import datetime
import attr

@attr.s
class Test(object):
    foo: str = attr.ib()
    dt: datetime.datetime = attr.ib(repr=datetime.datetime.isoformat)

结果:

>>> t = Test(foo='bar', dt=datetime.datetime.utcnow())                                                                                                                                                                                                       
>>> t                                                                                                                                                                                                                                                        
Test(foo='bar', dt=datetime.datetime(2019, 10, 31, 17, 59, 34, 603971))

预期:

Test(foo='bar', dt='2019-10-31T17:59:34.603971')

事实上,看起来任何参数都被忽略了。以下是 attr 文档中示例的轻微修改:

>>> @attr.s 
... class C(object): 
...     user = attr.ib() 
...     password = attr.ib(repr=lambda value: value[:2]) 
...                                                                                                                                                                                                                                                          
>>> C("me", "s3kr3t")                                                                                                                                                                                                                                        
C(user='me', password='s3kr3t')

我在这里错过了什么?

【问题讨论】:

    标签: python python-3.x python-attrs


    【解决方案1】:

    您的attrs 安装必须太旧。您的代码与attrs 19.3 完美配合:

    >>> import datetime
    >>> import attr
    >>>
    >>> @attr.s
    ... class Test(object):
    ...     foo: str = attr.ib()
    ...     dt: datetime.datetime = attr.ib(repr=datetime.datetime.isoformat)
    ...
    >>> Test(foo='bar', dt=datetime.datetime.utcnow())
    Test(foo='bar', dt=2019-11-01T05:40:59.745157)
    

    您可以使用以下命令查看attrs 的版本:

    >>> attr.__version__
    '19.3.0'
    

    repr 功能已在一个月前的 2019-10-01 发布的 19.2.0 中添加。

    【讨论】:

    • 是的,我在一个具有 attrs==18.2.0 的环境中,所以很可能就是这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2011-12-01
    • 2016-04-21
    • 2013-06-14
    • 2015-05-13
    • 2018-01-12
    相关资源
    最近更新 更多