首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么由一个最热的夹具和一个称为直接不同的函数产生的值是不同的?

为什么由一个最热的夹具和一个称为直接不同的函数产生的值是不同的?
EN

Stack Overflow用户
提问于 2022-04-27 11:32:53
回答 1查看 308关注 0票数 -1

在下面的代码中,我得到的是生成器对象。

代码语言:javascript
复制
<generator object a at 0x7feb40b2d7b0>
代码语言:javascript
复制
from playwright.sync_api import sync_playwright

def get_playwright():
    with sync_playwright() as playwright:
        yield playwright

print(get_playwright())

但是当我使用pytest时,我得到的是一个类对象。

代码语言:javascript
复制
<class 'playwright.sync_api._generated.Playwright'>`:
代码语言:javascript
复制
# conftest.py

import pytest
from playwright.sync_api import sync_playwright

@pytest.fixture()
def get_playwright():
    with sync_playwright() as playwright:
        yield playwright
代码语言:javascript
复制
# test_one.py

def test(get_playwright):
    print(get_playwright)

我不知道为什么会发生这种事?如何不使用pytest获得类?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-06 08:01:38

第一阶段:

代码语言:javascript
复制
def get_playwright():
    with sync_playwright() as playwright:
        yield playwright

print(get_playwright())  # <generator object get_playwright at 0x108aac580>

这是预期的,因为get_playwright是一个生成器,它返回一个发电机迭代器,您必须调用next(...)才能从迭代器中获得每个得到的值。

考虑一个简单的、非剧作家的例子:

代码语言:javascript
复制
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()一次才能获得实际对象:

代码语言:javascript
复制
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>

第二阶段:

代码语言:javascript
复制
@pytest.fixture()
def get_playwright():
    with sync_playwright() as playwright:
        yield playwright

def test(get_playwright):
    print(get_playwright)

这应该是相同的情况,但如果是生成器,pytest就会自动调用固定值的next()。我无法从pytest文档中找到这种行为的文档,但是其中一个pytest作者/维护者的另一个答案提到了它

这大概是执行死刑的地方

  • pytest注意到您的夹具用于测试功能。
  • pytest调用夹具函数
    • ,因为它是一个生成器,所以它会立即返回,而不需要执行代码

  • next(...) 注意到它是一个生成器,在它上调用
    • 这会导致代码执行到yield ,然后“”.,您可以把它看作是一种共同例程.

  • 然后pytest执行您的测试函数。

...which可能就是为什么传递给您的测试函数的值已经是next-ed值,它是剧作家对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72027987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档