Python DomainClass 列表反复添加最后一项
我有一个域数据类:
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 个回答
我不太确定我是否理解了这个问题,所以如果我的回答没有帮助,请提前原谅我。我不太清楚你是怎么调用你的异步函数的,但我用一些测试的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.
你能更具体一点吗?也许可以分享一下你是怎么调用这个方法的?