小编Ant*_* M.的帖子

如何防止python3.11 TaskGroup取消所有任务

我刚刚发现了 Python 3.11 的新功能,如 ExceptionGroup 和 TaskGroup,我对以下 TaskGroup 行为感到困惑:如果组内的一个或多个任务失败,则所有其他正常任务都将被取消,我没有机会更改该行为 示例:

async def f_error():
    raise ValueError()

async def f_normal(arg):
    print('starting', arg)
    await asyncio.sleep(1)
    print('ending', arg)


async with asyncio.TaskGroup() as tg:
    tg.create_task(f_normal(1))
    tg.create_task(f_normal(2))
    tg.create_task(f_error())

# starting 1
# starting 2
#----------
#< traceback of the error here >
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我无法打印“ending 1”和“ending 2”。asyncio.gather(return_exceptions=True)同时,在发生错误时提供类似选项不取消剩余任务的选项将非常有用。

你可以说“如果你不想要这种取消行为,就不要使用TaskGroup”,但答案是我想使用新的异常组功能,并且它严格绑定到TaskGroup

所以问题是:

  1. 我可以以某种方式在 asyncio 中使用异常组,而无需在 TaskGroup 中使用这种全有或全无的取消策略吗?
  2. 如果对于前面的答案是“否”:为什么 python 开发人员消除了在 TaskGroup API 中禁用取消的可能性?

python asynchronous python-asyncio python-3.11

7
推荐指数
1
解决办法
3194
查看次数

vscode/pylance 自动导入错误的根路径

假设我有一个具有以下文件结构的项目:

\n
project_dir\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package1\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module1.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 package2\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module2.py\n
Run Code Online (Sandbox Code Playgroud)\n

当我想在其他模块中使用 module1 中的某个类时,我输入类似的内容

\n
class SomeNewClass(ClassFromModule1):  # here I press ctrl-space to make auto-import\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n

当 Pylance 进行自动导入时,它总是从项目的根目录开始,所以我得到了这个自动导入:

\n
from src.package1.module1 import ClassFromModule1\n
Run Code Online (Sandbox Code Playgroud)\n

问题是我的工作目录是src并且我想得到

\n
from package1.module1 import ClassFromModule1\n
Run Code Online (Sandbox Code Playgroud)\n

有没有办法修复自动导入 Pylance 功能的根路径?

\n

python visual-studio-code vscode-python pylance

5
推荐指数
1
解决办法
1976
查看次数