Как добавить datetime.now (). Isoformat () в __init__ в NamedTuple? - PullRequest
0 голосов
/ 07 сентября 2018

Конечно, я пробовал:

class PdfContentRecord(NamedTuple):
    filename: str
    page: int
    cache: dict
    data: dict = dict()
    accessed: str = None

    def __new__(cls, *args, **kwargs):
        self = super().__new__(*args, **kwargs)
        self.accessed = datetime.now().isoformat()
        return self

Но я получаю точно такую ​​же ошибку, как и Как обеспечить дополнительную инициализацию для подкласса namedtuple?

Я не могу сказать, может ли attrs помочь мне (слишком сложно понять). dataclasses.dataclass, вероятно, может помочь, но он поддерживает только Python 3.7.

Или я мог бы написать свой класс, возможно, также с __slots__ ...

Edit:

Читали ли вы ответ на вопрос, который вы связали?

работает с from collection import namedtuple, но не from typing import NamedTuple.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Довольно красивый ответ, который требует pip install attrs (что вдохновляет dataclass)

import attr

@attr.s
class PdfFileRecord:
    name: str = attr.ib()
    type: str = attr.ib()
    cache: dict = attr.ib()
    data: dict = attr.ib(factory=dict)
    accessed: str = attr.ib(factory =lambda: datetime.now().isoformat())

Для версии dataclass, нет необходимости pip, но необходим как минимум Python 3.6 .

import dataclasses

@dataclasses.dataclass
class PdfFileRecord:
    name: str
    type: str
    cache: dict
    data: dict = dataclasses.field(default_factory =dict)
    accessed: str = dataclases.field(default_factory =lambda: datetime.now().isoformat())
0 голосов
/ 07 сентября 2018

Пользователи Python 3.7+ должны просто воспользоваться преимуществами default_factory или __post_init__ в классах данных .Для пользователей более старых версий Python читайте на ..

Я думаю, что вы должны быть в состоянии сделать это с дополнительным слоем типов:

from datetime import datetime
from typing import NamedTuple


class _PdfContentRecord(NamedTuple):
    filename: str
    page: int
    cache: dict
    data: dict = None
    accessed: str = None


class PdfContentRecord(_PdfContentRecord):

    def __new__(cls, filename, page, cache, data=None, accessed=None):
        if data is None:
            data = {}
        if accessed is None:
            accessed = datetime.now().isoformat()
        return super().__new__(cls, filename, page, cache, data, accessed)

Возможно, однако, вы потеряете некоторые изПреимущества использования NamedTuple в первую очередь, а также могут просто написать подтип самостоятельно.

...