为了账号安全,请及时绑定邮箱和手机立即绑定

Python 的 `assert False` 如何阻止 pytest 工作?

Python 的 `assert False` 如何阻止 pytest 工作?

子衿沉夜 2021-10-19 10:39:58
我assert False在flask/helpers.py中的以下类的__init__方法中添加了一条语句:class locked_cached_property(object):    """A decorator that converts a function into a lazy property.  The    function wrapped is called the first time to retrieve the result    and then that calculated result is used the next time you access    the value.  Works like the one in Werkzeug but has a lock for    thread safety.    """    def __init__(self, func, name=None, doc=None):        assert False        # ^ this is the problem        self.__name__ = name or func.__name__        self.__module__ = func.__module__        self.__doc__ = doc or func.__doc__        self.func = func        self.lock = RLock()    def __get__(self, obj, type=None):        if obj is None:            return self        with self.lock:            value = obj.__dict__.get(self.__name__, _missing)            if value is _missing:                value = self.func(obj)                obj.__dict__[self.__name__] = value            return value我很好奇一个assert False语句在__init__函数中是如何导致导入失败的。如果assert False是在__get__函数中,我仍然可以导入模块。这发生在 pytest 3.8.1 和 4.0.2 上。这是否意味着__init__在导入模块期间调用了装饰器?
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

您的装饰器在使用时总是会引发异常。请记住,装饰器代码在def它装饰的行之后立即执行。所以,在大多数情况下,模块不能无一例外地被导入。由于pytest首先导入一个模块,它永远不会到达执行测试的地步。


查看完整回答
反对 回复 2021-10-19
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

当您定义一个函数或类时,python 解释器会执行装饰器。

然后,它击中您的断言行并引发异常


查看完整回答
反对 回复 2021-10-19
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信