attr.ib игнорирует значение параметра - PullRequest
0 голосов
/ 31 октября 2019

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

Что мне здесь не хватает?

1 Ответ

1 голос
/ 01 ноября 2019

Ваша 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 была добавлена ​​в 19.2.0выпущенный всего месяц назад 2019-10-01.

...