Python DomainClass 列表反复添加最后一项

-1 投票
1 回答
54 浏览
提问于 2025-04-14 15:48

我有一个域数据类:

from pydantic import BaseModel
from pydantic.dataclasses import dataclass

@dataclass(frozen=False)
class ValueObject:
    """
    Base class for value objects
    """

@dataclass(frozen=False)
class Rss(ValueObject):
    index: int
    title: str
    titleDetail: str

然后我有一个叫做“RssFeedReader”的服务

"""Services module."""
from typing import Any
from dataclasses import dataclass,field
import feedparser
from pydantic import BaseModel
from DomainModels import Rss

'''force Rss to be a DM & not a module'''
class Rss(BaseModel):
    def __next__(self):
        yield self

@dataclass(kw_only=True)
class RssFeedReader:

    krssResult: list[Rss] = field(default_factory=list)
    
    #public commands    
    async def Read(self, url:str):        
        feed = feedparser.parse(url)["entries"]
        
        kRss = Rss
        for i in range(len(feed)):
            kRss.index = i
            kRss.title = feed[i]["title"]            
            kRss.titleDetail =feed[i]["title_detail"]            
            self.AddResult(i,kRss)            

        return self.krssResult
    

    def AddResult(self, i, rss:Rss):    
        print(i)    
        self.krssResult.append(rss)

现在有个问题,虽然它在遍历这些项目并且打印出每个索引,但当我调用这个服务时,所有50个项目都变成了最后一个索引的重复,前面49个值都被替换成了最后一个结果。

我也尝试过用insert(i, rss),但结果还是一样的问题。

我是在一个flask应用中调用这个服务,并且使用了依赖注入(DI)。

main.py

from flask import Flask
from flask_bootstrap import Bootstrap
from .wiring import init_app

from .Container import Container
from . import views

def create_app() -> Flask:
    container = Container()
    app = Flask("rssfeed")
    app.container = container
    init_app()

    app.add_url_rule("/", "index", views.index)

    bootstrap = Bootstrap()
    bootstrap.init_app(app)

    return app

views.py

""" app moudle """
from flask import Flask
from dependency_injector.wiring import inject, Provide

from .Container import Container
from .RssFeedService import RssFeedReader

@inject
async def index(rss_feed_service: RssFeedReader = Provide[Container.rss_feed_service]):

    read = await rss_feed_service.Read(url="https://kotaku.com/rss")
    
    return "<h1>News system</h1>" + str(read)

container.py

from dependency_injector import containers, providers
from . import RssFeedService

class Container(containers.DeclarativeContainer):
    
    wiring_config = containers.WiringConfiguration(modules=[".views"])
    
    rss_feed_service = providers.Factory(
        RssFeedService.RssFeedReader        
    )

如果我把标题添加到一个黑色数组中,它能顺利传到前端,只有当我绑定到“krssResult: list[Rss]”时,才会出现这个问题。

1 个回答

-1

我不太确定我是否理解了这个问题,所以如果我的回答没有帮助,请提前原谅我。我不太清楚你是怎么调用你的异步函数的,但我用一些测试的RSS源玩了你的代码,结果大致上是我预期的那样:

从dataclasses导入dataclass和field
导入feedparser
从pydantic导入BaseModel
从DomainModels导入Rss
导入asyncio

"""强制Rss成为一个数据模型,而不是一个模块"""

类Rss(BaseModel):
def next(self):
yield self

@dataclass(kw_only=True)
类RssFeedReader:

krssResult: list[Rss] = field(default_factory=list)

# public commands
async def Read(self, url: str):
    feed = feedparser.parse(url)["entries"]

    kRss = Rss
    for i in range(len(feed)):
        kRss.index = i
        kRss.title = feed[i]["title"]
        # kRss.titleDetail = feed[i]["title_detail"]
        kRss.titleDetail = feed[i]["description"]
        self.AddResult(i, kRss)

    return self.krssResult

def AddResult(self, i, rss: Rss):
    print(i)
    self.krssResult.append(rss)
    print(self.krssResult[i - 1].title)
    print(self.krssResult[i - 1].titleDetail)

myTestReader = RssFeedReader()
loop = asyncio.get_event_loop()
loop.run_until_complete(myTestReader.Read(url="https://lorem-rss.herokuapp.com/feed"))
loop.close()

结果:

0
Lorem ipsum 2024-03-15T14:10:00Z
Eiusmod eiusmod consequat fugiat cillum nisi nisi.
1
Lorem ipsum 2024-03-15T14:09:00Z
Nisi cillum et do sunt enim consequat voluptate id qui sint officia nisi dolore et.
2
Lorem ipsum 2024-03-15T14:08:00Z
Ex et enim est ullamco laborum cupidatat minim pariatur tempor nisi officia.
3
Lorem ipsum 2024-03-15T14:07:00Z
Velit fugiat nostrud anim nostrud.
4
Lorem ipsum 2024-03-15T14:06:00Z
Adipisicing minim cupidatat fugiat non velit elit.
5
Lorem ipsum 2024-03-15T14:05:00Z
Veniam officia labore magna ad.
6
Lorem ipsum 2024-03-15T14:04:00Z
Laborum enim reprehenderit mollit laborum.
7
Lorem ipsum 2024-03-15T14:03:00Z
Mollit amet laboris eu ad fugiat non excepteur nisi dolor do eiusmod aliqua eiusmod.
8
Lorem ipsum 2024-03-15T14:02:00Z
Culpa reprehenderit deserunt mollit enim nostrud ea non minim pariatur nisi.
9
Lorem ipsum 2024-03-15T14:01:00Z
Id et laboris id officia mollit dolor enim.

你能更具体一点吗?也许可以分享一下你是怎么调用这个方法的?

撰写回答