在下面的代码中,我得到的是生成器对象。
<generator object a at 0x7feb40b2d7b0>from playwright.sync_api import sync_playwright
def get_playwright():
with sync_playwright() as playwright:
yield playwright
print(get_playwright())但是当我使用pytest时,我得到的是一个类对象。
<class 'playwright.sync_api._generated.Playwright'>`:# conftest.py
import pytest
from playwright.sync_api import sync_playwright
@pytest.fixture()
def get_playwright():
with sync_playwright() as playwright:
yield playwright# test_one.py
def test(get_playwright):
print(get_playwright)我不知道为什么会发生这种事?如何不使用pytest获得类?
发布于 2022-05-06 08:01:38
第一阶段:
def get_playwright():
with sync_playwright() as playwright:
yield playwright
print(get_playwright()) # <generator object get_playwright at 0x108aac580>这是预期的,因为get_playwright是一个生成器,它返回一个发电机迭代器,您必须调用next(...)才能从迭代器中获得每个得到的值。
考虑一个简单的、非剧作家的例子:
In [14]: def generate_nums():
...: for num in range(10):
...: yield num
...:
In [15]: nums = generate_nums()
In [16]: nums
Out[16]: <generator object generate_nums at 0x11115e6d0>
In [17]: next(nums)
Out[17]: 0
In [18]: next(nums)
Out[18]: 1
In [19]: next(nums)
Out[19]: 2有关更多示例,请参见理解Python中的生成器。
由于get_playwright返回迭代器,因此需要调用next()一次才能获得实际对象:
from playwright.sync_api import sync_playwright
def get_playwright():
with sync_playwright() as playwright:
yield playwright
playwright_generator = get_playwright()
print(playwright_generator) # <generator object get_playwright at 0x104031580>
playwright = next(playwright_generator)
print(playwright) # <playwright._impl._playwright.Playwright object at 0x1041aabb0>第二阶段:
@pytest.fixture()
def get_playwright():
with sync_playwright() as playwright:
yield playwright
def test(get_playwright):
print(get_playwright)这应该是相同的情况,但如果是生成器,pytest就会自动调用固定值的next()。我无法从pytest文档中找到这种行为的文档,但是其中一个pytest作者/维护者的另一个答案提到了它
这大概是执行死刑的地方
next(...) 注意到它是一个生成器,在它上调用 yield ,然后“”.,您可以把它看作是一种共同例程....which可能就是为什么传递给您的测试函数的值已经是next-ed值,它是剧作家对象。
https://stackoverflow.com/questions/72027987
复制相似问题