0

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')

我在这里想念什么?

4

1 回答 1

1

您的attrs安装必须太旧。您的代码与attrs19.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 中添加。

于 2019-11-01T05:43:01.133 回答