- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个使用 re.escape()
方法返回字符的函数。在实证测试中它似乎有效,我想用 pytest 测试它。但是我无法让测试正常工作,所以在尝试了几次之后,我尝试了类似的方法:
def test_escape():
> assert re.escape('!') == "\\!"
E AssertionError: assert '!' == '\\!'
E - !
E + \!
test/test_e.py:6: AssertionError
我还用解释器测试了它,没有任何问题:
>>> re.escape('!') == '\\!'
True
使用“-s”禁用 pytest 输出的捕获并尝试打印 re.escape('!')
的输出我得到 “!”
而不是 "\!"
,这不会发生在解释器上。
我试图通过强制 "\!"
作为输出来 monkeypatch re.escape,它神奇地起作用了。这显然没有解决我的问题,但通过 re.escape 突出了我不知道的某种问题
@pytest.fixture
def mock_escape(monkeypatch):
monkeypatch.setattr(re, "escape", lambda x: "\\!")
def test_escape(mock_escape):
assert re.escape('!') == "\\!"
...
test/test_e.py .
======================================== 1 passed in 0.07s =========================================
all test passed
出于好奇,我对我的原始函数做了同样的事情(没有 monkeypatching 但编辑了它的返回值),即使在这种情况下它也能工作。所以这不是因为导入而发生的问题。
<罢工># 编辑:#tmt发现是python或者pytest版本的问题。问题出现在 python 3.7.2 和 pytest 5.2.1 上。python 3.6.3 和 pytest 4.5.0 不会出现此问题所以这几乎可以肯定是一个错误(在我看来更容易出现 pytest)正如家伙的回复,这只是 re.escape() 的行为改变
最佳答案
如果您查看 re.py,您会看到 escape()
正在使用定义的特殊字符列表
_special_chars_map = {i: '\\' + chr(i) for i in b'()[]{}?*+-|^$\\.&~# \t\n\r\v\f'}
def escape(pattern):
"""
Escape special characters in a string.
"""
if isinstance(pattern, str):
return pattern.translate(_special_chars_map)
else:
pattern = str(pattern, 'latin1')
return pattern.translate(_special_chars_map).encode('latin1')
和 !
不包含在那里,所以 re.escape('!')
返回 !
,而不是 \!
.
assert re.escape('[') == '\\['
例如会起作用。
更新:
此答案适用于 Python 3.7,适用于 Python 3.6。 Pull request #1007 改变了 escape()
pull source code
re.escape() now escapes only special characters.
以前的版本:
_alphanum_str = frozenset("_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890")
_alphanum_bytes = frozenset(b"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890")
def escape(pattern):
if isinstance(pattern, str):
alphanum = _alphanum_str
s = list(pattern)
for i, c in enumerate(pattern):
if c not in alphanum:
if c == "\000":
s[i] = "\\000"
else:
s[i] = "\\" + c
return "".join(s)
else:
alphanum = _alphanum_bytes
s = []
esc = ord(b"\\")
for c in pattern:
if c in alphanum:
s.append(c)
else:
if c == 0:
s.extend(b"\\000")
else:
s.append(esc)
s.append(c)
return bytes(s)
它于 2017 年 4 月 13 日进行了修改,因此查看 versions history re.escape('!') == '\\!'
应该适用于 Python 3.6 和更旧版本。
关于python - pytest:使用 re.escape() 断言转义字符失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58796508/
我有以下实体字段: /** * @Assert\Regex( * pattern = "/^d+\.(jpg|png|gif)$/", * htmlPattern = "/^d+\.(j
我有一个显示查询结果的表。 我使用这个检查表包含结果: cy.get("table", {timeout: 60000}).find("tr[data-index]").should("have.le
void (assert)(int e) { assert(e); } 这里是如何工作的? 最佳答案 void (assert)(int e) 相当于 void assert(int) 为什么
大家好,我的第一次测试遇到了一些问题 我正在写这个 fragment ,但我一直遇到这个问题: java.lang.AssertionError at org.junit.Assert.fail(As
从表中,我获取字符串列表,并想检查当 val!= "A"时,表列表中是否存在字符串“x”: for (int i = 0; i list = new ArrayList(); for(int i=0
我想在现有代码中为 VHDL 断言操作添加一个错误计数器。基本上,我的代码如下所示: assert data = good_data report "Bad data" severity er
我有一个无法处理的问题,所以我想也许你可以帮助我。基本上我有一个函数,它接收 char* 作为参数并对其执行一些操作(我已经检查了这些步骤/函数,它们工作得很好)。如果函数中给出的 char* 是“”
我有一些代码用于检查输入日期是否正确。只需检查是否不超过 12 个月,给定月份中的日期是否正确,并且还应该考虑闰年(因此,基本上是正常的日期检查)。唯一不合适的是年份不应低于 2000。如果日期无效,
我有一个关于 Cypress 断言的问题,最近才开始使用这个测试平台,但是当 URL 返回一个随机数时卡住了,如下所示。 /Geocortex/Essentials/REST/sites/SITE?f
我有一个 Python mock对象,我想断言是否设置了该对象的任何属性。 我不相信PropertyMock将适用于我的目的,因为我必须知道是否设置了任何属性,而不是特定属性。 它也不像我可以模拟模拟
考虑这个简单的基类 Foo 有一个函数 foo 调用一个纯虚函数 foo_,用 Doxygen 记录: class Foo { public: /** \brief This functi
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我在这段代码中执行 malloc 时遇到问题, /*function starts*/ if(NULL==(partial_results=(bignum_t**)malloc(sizeof
大家好,我想知道如何将整个代码块放入一个断言中? 例如,我有一个数组,我想对数组的每个值进行断言。这是我的代码的样子: for (int value : values) { assert Wi
这不是我的作业——我只是在练习。我似乎无法完全理解这个断言概念。 1) Determine the pre-condition for x that guarantees the post-condi
是否可以在带有时间戳的断言失败时记录信息 例如 int a = 10 assert( a > 100 ); 那么它将失败并像时间戳一样输出 2013-12-02 , 17:00:05 assert f
由于我们公司不使用单元测试,所以我正在自学对自己的代码进行单元测试。我正在使用标准的 .net 测试框架进行一些非常基本的单元测试。 我的一个方法返回一个 IEnumerable我想测试它的输出。所以
我有一个如下所示的对象数组,并且只想针对数组中的某些字段进行断言。 对象数组 - var a = [{"key":"key2","value":"value2","updatedBy":"name1"
我正在尝试编写一个 PSL 断言来检查输入断言的数量是否与输出断言的数量相匹配。 例如: . 在输入上任何时候都可能发生任何事情,输出也可以在任何时候断言。确切时间未知,也不重要。我要验证的是没有信息
我想在Cypress中做一个断言如下: cy.get(a).should('be.visible').or(()=>{ cy.get(b).should('be.visible'); });
我是一名优秀的程序员,十分优秀!