有什么新的内容在icodeapi v1.3.0中?
概述
改版本号
优化了server模块的大量类型提示和注释
优化了server.ServerPool
的并发运行方式,更改为基于进程执行器的并发
添加了server.IcodeServer.CheckWorks
来监听社区内作品的信息
优化server.ServerPool
中某些方法的返回值
修复关于server.IcodeServer
的results
属性的bug
添加tools.ResubmitAllWorks
异步迭代器,用于不断重发作品
优化了IcodeAPI和AsyncIcodeAPI的submitWork
,reply
,deleteComment
,praiseComment
方法的传参方式
添加WorkInfoTupleGenerator
和AsyncWorkInfoTupleGenerator
来生成包含作品基础信息及作品发布信息的元组
基于进程执行器的并发
server.ServerPool
的RunServers
方法现在会创建一个进程执行器,并使用该执行器来并发运行server.RunServer
函数,以运行池中所有server.IcodeServer
实例的run
方法。
以下是源代码的改造:
async def RunServers(self) -> list[list]:
'''Run all the servers in pool in processes'''
loop = asyncio.get_event_loop()
with ProcessPoolExecutor() as executor:
coros = [loop.run_in_executor(executor, RunServer, i) for i in self.__servers]
await asyncio.gather(* coros)
return [i.results for i in self.__servers]
监听社区内作品
新增了server.IcodeServer.CheckWorks
方法以监听社区作品集的所有变化。
from icodeapi import AsyncIcodeAPI
from icodeapi.server import IcodeServer, RunServer
cookie = input('Enter your cookie: ')
user = AsyncIcodeAPI(cookie = cookie)
server = IcodeServer(api = user)
@server.CheckWorks()
def main(works : dict):
print('新的作品:')
print(works)
RunServer(server)
BUG修复
现在server.IcodeServer.result
不会再含有空列表。
重发作品异步迭代器
tools.ResubmitAllWorks
可以用于不断重发作品。
该迭代器每将所有已发布作品重发一次,就会yield
一次asyncio.gather
的返回值,返回值中包括错误和AsyncIcodeAPI.submitWork
的返回值。
from icodeapi.tools import ResubmitAllWorks
from icodeapi import AsyncIcodeAPI
import asyncio
cookie = input('Enter your cookie: ')
user = AsyncIcodeAPI(cookie = cookie)
async def main():
global user
await user.login()
async for i in ResubmitAllWorks(user):
mapResult = list(map((lambda x : isinstance(x, Exception)), i))
print(f'{mapResult.count(False)}个成功,{mapResult.count(True)}个异常')
await user.closeClient()
asyncio.run(main())
部分api拥有新的传参方式
现在,定义了更多类来更加方便地传参。例如IcodeAPI.submitWork
的workType
参数,可以传入PythonWork
类来表示需要发布一个Python作品。
from icodeapi import IcodeAPI, PythonWork
cookie = input('Enter your cookie: ')
user = IcodeAPI(cookie = cookie)
user.submitWork(
'print("Hello World")',
PythonWork,
title = '你好,世界'
)
作品信息元组生成器
由于IcodeAPI.submitWork
和AsyncIcodeAPI.submitWork
的workDetail
参数需要一个包含作品详细信息的元组,所以为了便利使用,两个新的函数应运而生。
WorkInfoTupleGenerator
和AsyncWorkInfoTupleGenerator
。
from icodeapi import WorkInfoTupleGenerator, AsyncWorkInfoTupleGenerator
from icodeapi import IcodeAPI, AsyncIcodeAPI
import asyncio
cookie = input('Enter your cookie: ')
user = IcodeAPI(cookie = cookie)
workId = input('Enter work id: ')
print(user.submitWork(
workDetail = WorkInfoTupleGenerator(user, workId),
workId = workId))
async def main():
api = AsyncIcodeAPI(cookie = cookie)
await api.login()
print(await api.submitWork(
workDetail = (await AsyncWorkInfoTupleGenerator(api, workId)),
workId = workId
))
await api.closeClient()
asyncio.run(main())