我正在尝试将我的应用程序从 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”
这是我的方法,但我觉得不是很简单,有什么更好的方法吗?
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中的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本身不做呢?