了解 python 中位于括号中的函数之前的星号运算符

Understanding the asterisk operator in python when it's before the function in a parenthesis

我知道星号用于解包系统参数等值,或者当您将列表解包为变量时。

但是我之前没有在这个 asyncio 示例中看到过这种语法。

我在这里阅读这篇文章,https://realpython.com/async-io-python/#the-10000-foot-view-of-async-io,但我不明白星号运算符在这种情况下的作用。

#!/usr/bin/env python3
# rand.py

import asyncio
import random

# ANSI colors
c = (
    "3[0m",   # End of color
    "3[36m",  # Cyan
    "3[91m",  # Red
    "3[35m",  # Magenta
)

async def makerandom(idx: int, threshold: int = 6) -> int:
    print(c[idx + 1] + f"Initiated makerandom({idx}).")
    i = random.randint(0, 10)
    while i <= threshold:
        print(c[idx + 1] + f"makerandom({idx}) == {i} too low; retrying.")
        await asyncio.sleep(idx + 1)
        i = random.randint(0, 10)
    print(c[idx + 1] + f"---> Finished: makerandom({idx}) == {i}" + c[0])
    return i

async def main():
    res = await asyncio.gather(*(makerandom(i, 10 - i - 1) for i in range(3)))
    return res

if __name__ == "__main__":
    random.seed(444)
    r1, r2, r3 = asyncio.run(main())
    print()
    print(f"r1: {r1}, r2: {r2}, r3: {r3}")

async def main functionmakerandom 之前有一个星号。有人可以解释它在这种情况下的作用吗?我想了解 async / await 是如何工作的。

我看了这个答案,Python asterisk before function但它并没有真正解释它。

星号不在makerandom之前,它在生成器表达式

之前
(makerandom(i, 10 - i - 1) for i in range(3))

asyncio.gather 不将可迭代对象作为其第一个参数;它接受可变数量的可等待对象作为位置参数。为了从生成器表达式到那个,你需要解压生成器。

在此特定实例中,星号解包

asyncio.gather(*(makerandom(i, 10 - i - 1) for i in range(3)))

进入

asyncio.gather(makerandom(0, 9), makerandom(1, 8), makerandom(2, 7))

一个星号,表示 unpacking. It spreads the iterable into several arguments 如:

array = [1, 2, 3]
print(*array)

相同
print(1, 2, 3)

另一个例子:

generator = (x for x in range(10) if my_function(x))
print(*generator)

一个星号用于普通的迭代器,但是当涉及到 mappings 时,您也可以使用双星号作为 ** 以便将映射解压缩到关键字参数中,如:

dictionary = {"hello": 1, "world": 2}
my_function(**dictionary)

这相当于 my_function(hello=1, world=2)。 您还可以使用普通的一个星号,以便仅从映射中解压缩密钥:

print(*{"hello": 1, "world": 2})

这将导致 hello world