跳转至

有什么新的内容在icodeapi v1.3.0中?

概述

改版本号
优化了server模块的大量类型提示和注释
优化了server.ServerPool的并发运行方式,更改为基于进程执行器的并发
添加了server.IcodeServer.CheckWorks来监听社区内作品的信息
优化server.ServerPool中某些方法的返回值
修复关于server.IcodeServerresults属性的bug
添加tools.ResubmitAllWorks异步迭代器,用于不断重发作品
优化了IcodeAPI和AsyncIcodeAPI的submitWork, reply, deleteComment, praiseComment方法的传参方式
添加WorkInfoTupleGeneratorAsyncWorkInfoTupleGenerator来生成包含作品基础信息及作品发布信息的元组

基于进程执行器的并发

server.ServerPoolRunServers方法现在会创建一个进程执行器,并使用该执行器来并发运行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.submitWorkworkType参数,可以传入PythonWork类来表示需要发布一个Python作品。

from icodeapi import IcodeAPI, PythonWork
cookie = input('Enter your cookie: ')
user = IcodeAPI(cookie = cookie)
user.submitWork(
    'print("Hello World")',
    PythonWork,
    title = '你好,世界'
)

作品信息元组生成器

由于IcodeAPI.submitWorkAsyncIcodeAPI.submitWorkworkDetail参数需要一个包含作品详细信息的元组,所以为了便利使用,两个新的函数应运而生。
WorkInfoTupleGeneratorAsyncWorkInfoTupleGenerator

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())