小编Nig*_*ini的帖子

在 Python 中测试生成器

我在 Python 3.4 中编写了一个非常简单的生成器:

class Gen:
  def __init__(self, xml_lines, attribs):
    #...

  def _get_values(self, xml_line):
    # get only specific "attribs" from a line in a "xml"

  def values(self):
    for line in self.xml_lines:
      yield self._get_values(line)
Run Code Online (Sandbox Code Playgroud)

当我使用 for 循环来使用生成的值时,代码有效:

reader = Gen(...):
for v in reader.values():
   print(v)
Run Code Online (Sandbox Code Playgroud)

但是我现在正在尝试创建一个单元测试,为此,我需要一次获取每个值(在循环之外)。我正在尝试这样的事情:

import unittest
#...
reader = Gen(...):
v = reader.values()
self.assertIsNone(v)
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,我总是得到一个

AssertionError: <generator object next_values at 0x7fe2a5f9e3f0> is not None
Run Code Online (Sandbox Code Playgroud)

所以,当我自己调用这些值时,它返回一些东西(它是一个指针吗?)而不是生成的值。

当我考虑使用基本的生成器模式时,我的问题比我自己的代码更广泛:测试 Python 生成器的正确方法是什么?

python unit-testing generator python-3.x

7
推荐指数
2
解决办法
9188
查看次数

使用 websockets lib 和 Python3.7 启动服务器的适当方法

该库的文档显示以下代码应该适用并且它确实有效:

start_server = websockets.serve(hello, 'localhost', 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Run Code Online (Sandbox Code Playgroud)

但新的Python 3.7 ASYNCIO库增加了asyncio.run其“运行经过协程”和“应作为一个主要切入点ASYNCIO方案。” 此外,在查看上述get_event_loop()使用的文档时,它显示:

应用程序开发人员通常应该使用高级 asyncio 函数,例如 asyncio.run()...

我尝试通过以下方式使用 run:

server = websockets.serve(hello, 'localhost', 8765)
asyncio.run(server)
Run Code Online (Sandbox Code Playgroud)

我从中得到一个:

ValueError: a coroutine was expected, got <websockets.server.Serve object at 0x7f80af624358>
sys:1: RuntimeWarning: coroutine 'BaseEventLoop.create_server' was never awaited
Run Code Online (Sandbox Code Playgroud)

然后我尝试通过执行以下操作将服务器包装在任务中:

server = asyncio.create_task(websockets.serve(handle, 'localhost', 8765))
asyncio.run(server)
Run Code Online (Sandbox Code Playgroud)

我从中得到一个:

RuntimeError: no running event loop
sys:1: RuntimeWarning: coroutine 'BaseEventLoop.create_server' was never awaited
Run Code Online (Sandbox Code Playgroud)

由于最后一个警告,我也尝试过:

async def …
Run Code Online (Sandbox Code Playgroud)

python websocket python-3.7

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