小编Tar*_*tor的帖子

python3.6 新更改 'async for' 与 enumerate 不兼容吗

我正在尝试将我的应用程序从 python2.7 移动到 python3.6,用于 asyncio 和相关库,但我发现某些功能无法正常工作,因为我除外。我使用 motor 从 mongodb 异步查询,例如:

async def do_query():
    song_already_processed = set()
    song_table = db.song_table
    async for index, item in enumerate(song_table.find({'lang': 'English'},
                              {'id': 1, '_id': 0, 'title': 1, 'artist.name': 1})):
        if index > 100:
            break
        if item['id'] in song_already_processed:
            continue
        song_already_processed.add(item['id'])

    print(len(song_already_processed))
Run Code Online (Sandbox Code Playgroud)

但它引发了错误:

TypeError: 'AsyncIOMotorCursor' object is not iterable
Run Code Online (Sandbox Code Playgroud)

我认为异步迭代器协议与普通的迭代器协议不同,所以枚举不能很好地工作。是否有我可以使用的异步枚举?

顺便说一句,我知道很多方法来获取 100 个文档并停止迭代,我只想知道如何正确使用“async for”

python asynchronous mongodb python-asyncio python-3.6

5
推荐指数
2
解决办法
3160
查看次数

在python中,如何简单地使用兼容普通函数和协程函数的装饰器?

这是我的方法,但我觉得不是很简单,有什么更好的方法吗?

import asyncio
import time


def timer_all(f):
    if asyncio.iscoroutinefunction(f):
        async def wrapper(*args, **kwargs):
            now = time.time()
            result = await f(*args, **kwargs)
            print('used {}'.format(time.time() - now))
            return result
    else:
        def wrapper(*args, **kwargs):
            now = time.time()
            result = f(*args, **kwargs)
            print('used {}'.format(time.time() - now))
            return result

    return wrapper
Run Code Online (Sandbox Code Playgroud)

有很多装饰器,重试,添加日志等,都会这样写,有点丑,对吧?

python

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

为什么我不能使用join来实现__str__的对象列表?

我正在学习Python中的duck typing,我知道如果你为一个类实现一些特殊的方法,你可以愉快地使用内置的类方法

例如:

class A:
    def __init__(self,l):
        self._l = l
    def __iter__(self):
        return iter(self._l)
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我可以使用for...in..,zip,以及其他一些内置的方法,也可以做一些其他的东西,比如实现 __setitem__(),所以我可以使用random.choice,random.shuffle,我觉得python很酷,但是我发现这个问题,我想使用join来打印我实现其__str__方法的一些对象,但它不起作用

我发现这是因为当我们使用join时,我们写它就好了';'.join(l),所以duck typing技巧对它不起作用,因为它使用str的方法而不是对象将被连接

但是为什么呢?因为很多人都建立了友好的鸭子打字方法,为什么不加入?

@SethMMorton是我的疑点,谢谢我知道我可以';'.join([str(i) for i in l])用来解决我的问题,但我不知道为什么python本身不做呢?

python duck-typing

4
推荐指数
1
解决办法
128
查看次数