【发布时间】:2018-02-28 10:27:37
【问题描述】:
如果我将一个整数添加到 Python 集合对象两次,Python 只会添加一次。
a = set()
a.add(5)
a.add(5)
print(a)
>> {5}
但是,在我的应用程序中,我正在尝试将协程添加到集合中,因为我找不到更好的方法来跟踪哪些协程已经在 event_loop 中。我对以下行为感到惊讶:
async def foo(something):
await asyncio.sleep(1)
print(something)
a = set()
coro_obj = foo("hi")
a.add(coro_obj)
coro_obj = foo("hi")
a.add(coro_obj)
print(a)
{<coroutine object foo at 0x7f36f8c52888>, <coroutine object foo at 0x7f36f8c52360>}
我不太确定我在这里做了什么。我是否正确地认为如果协程对象不可散列,它就不会被添加到集合中?所以它是可哈希的,对吧?
如果它是可散列的,为什么我们会得到两个具有相同方法/参数的不同散列?
【问题讨论】:
-
add 方法实际上返回 None。
-
你创建了两个具有不同 foo 协程函数 id 的 func 实例......你到底想要实现什么
-
每次调用同步函数时,你只是得到一个不同的协程对象。在最后一行的那些对象的表示中可以清楚地看到。