我如何使用@DataClass实现 *asdict()或 *asdict()

发布于 2025-01-21 12:37:05 字数 1495 浏览 1 评论 0原文

我无法实现asdisct。我有阅读信息,但是使用Asdict时仍然有错误。

@dataclass
class InfoMessage():
    """Информационное сообщение o тренировке."""
    def __init__(self,
                 training_type: str,  # Тип тренировки.
                 duration: float,  # Продолжительность тренировки.
                 distance: float,  # Продолжительность тренировки.
                 speed: float,  # Дистанция, выполняемая на тренировке.
                 calories: float) -> None:  # Калории, сжигаемые на тренировке.
        self.training_type = training_type    # имя класса тренировки.
        self.duration = duration    # длительность тренировки в часах.
        # дистанция в километрах, которую преодолел пользователь
        # за время тренировки.
        self.distance = distance
        # средняя скорость, с которой двигался пользователь.
        self.speed = speed
        # количество килокалорий, которое израсходовал пользователь
        # за время тренировки.
        self.calories = calories
        self.message = ('Тип тренировки: {self.training_type}_1d;'
                        'Длительность: {self.duration:.3f}_1d ч.; '
                        'Дистанция: {self.distance:.3f}_1d км; '
                        'Ср. скорость: {self.speed:.3f}_1d км/ч; '
                        'Потрачено ккал: {self.calories:.3f}_1d.')

    def get_message(self) -> str:
        """функция для отображения окончательного сообщения."""
        return self.message.format(*asdict(self))

I can't implement asdisct. I have read information but I still have errors when using asdict.

@dataclass
class InfoMessage():
    """Информационное сообщение o тренировке."""
    def __init__(self,
                 training_type: str,  # Тип тренировки.
                 duration: float,  # Продолжительность тренировки.
                 distance: float,  # Продолжительность тренировки.
                 speed: float,  # Дистанция, выполняемая на тренировке.
                 calories: float) -> None:  # Калории, сжигаемые на тренировке.
        self.training_type = training_type    # имя класса тренировки.
        self.duration = duration    # длительность тренировки в часах.
        # дистанция в километрах, которую преодолел пользователь
        # за время тренировки.
        self.distance = distance
        # средняя скорость, с которой двигался пользователь.
        self.speed = speed
        # количество килокалорий, которое израсходовал пользователь
        # за время тренировки.
        self.calories = calories
        self.message = ('Тип тренировки: {self.training_type}_1d;'
                        'Длительность: {self.duration:.3f}_1d ч.; '
                        'Дистанция: {self.distance:.3f}_1d км; '
                        'Ср. скорость: {self.speed:.3f}_1d км/ч; '
                        'Потрачено ккал: {self.calories:.3f}_1d.')

    def get_message(self) -> str:
        """функция для отображения окончательного сообщения."""
        return self.message.format(*asdict(self))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

篱下浅笙歌 2025-01-28 12:37:05

我认为您在这里不使用@DataClass Decorator,但您也不需要解决问题。如果您将自我传递到字符串模板,则应很好地格式化。

    def get_message(self) -> str:
        return self.message.format(self=self)

但是,我认为您在正确的轨道上使用dataclass,因为这可能会使您的代码变得更加简单:

@dataclass
class InfoMessage:
    training_type: str  
    duration: float 
    distance: float 
    speed: float
    calories: float
    
    _MESSAGE_TEMPLATE = (
        'Тип тренировки: {self.training_type}_1d;'
        'Длительность: {self.duration:.3f}_1d ч.; '
        'Дистанция: {self.distance:.3f}_1d км; '
        'Ср. скорость: {self.speed:.3f}_1d км/ч; '
        'Потрачено ккал: {self.calories:.3f}_1d.'
    )
        
    def get_message(self) -> str:
        return self._MESSAGE_TEMPLATE.format(self=self)

如果您仅将其用于调试目的,那么您可能会从中找到自然的弦乐化。 Dataclass已经足够好:

print(InfoMessage(training_type="training type", duration=1, distance=2, speed=3.0, calories=4.0))

# InfoMessage(training_type='training type', duration=1, distance=2, speed=3.0, calories=4.0)

I don't think you are making use of the @dataclass decorator here, but you also don't need to to fix your problem. If you pass self to your string template it should format nicely.

    def get_message(self) -> str:
        return self.message.format(self=self)

However, I think you are on the right track with a dataclass as this could make your code a lot simpler:

@dataclass
class InfoMessage:
    training_type: str  
    duration: float 
    distance: float 
    speed: float
    calories: float
    
    _MESSAGE_TEMPLATE = (
        'Тип тренировки: {self.training_type}_1d;'
        'Длительность: {self.duration:.3f}_1d ч.; '
        'Дистанция: {self.distance:.3f}_1d км; '
        'Ср. скорость: {self.speed:.3f}_1d км/ч; '
        'Потрачено ккал: {self.calories:.3f}_1d.'
    )
        
    def get_message(self) -> str:
        return self._MESSAGE_TEMPLATE.format(self=self)

If you only use this for debugging purposes, then you might find the natural stringification from dataclass is good enough:

print(InfoMessage(training_type="training type", duration=1, distance=2, speed=3.0, calories=4.0))

# InfoMessage(training_type='training type', duration=1, distance=2, speed=3.0, calories=4.0)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文