我知道%load
函数(以前%loadpy
)将文件(或URL,...)的内容加载到新的输入单元格中(之后可以执行).
我也知道%less
,%more
并且%pycat
,它在分页器中显示文件的内容(这意味着在笔记本中它显示在屏幕底部的分割窗口中).
是否有(魔术)命令加载文件并在输出单元格中显示其内容(带语法高亮显示)?
即如下所示,但结果的语法高亮:
with open('my_file.py', 'r') as f:
print(f.read())
Run Code Online (Sandbox Code Playgroud)
我希望文件内容与.ipynb文件一起存储,但是当我执行Cell - > Run All时,我不希望它被执行.
是否有类似的命令%psource
显示输出单元格中的源代码而不是寻呼机?
如果我有两个参数化夹具,我怎么能创建一个单独的测试函数,首先用一个夹具的实例调用,然后用另一个夹具的实例调用?
我想创建一个以某种方式连接两个现有灯具的新灯具是有意义的.这适用于"普通"灯具,但我似乎无法使用参数化灯具.
这是我尝试过的简化示例:
import pytest
@pytest.fixture(params=[1, 2, 3])
def lower(request):
return "i" * request.param
@pytest.fixture(params=[1, 2])
def upper(request):
return "I" * request.param
@pytest.fixture(params=['lower', 'upper'])
def all(request):
return request.getfuncargvalue(request.param)
def test_all(all):
assert 0, all
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我收到此错误:
request = <SubRequest 'lower' for <Function 'test_all[lower]'>>
@pytest.fixture(params=[1, 2, 3])
def lower(request):
> return "i" * request.param
E AttributeError: 'SubRequest' object has no attribute 'param'
Run Code Online (Sandbox Code Playgroud)
...和相同的错误upper()
.
我做错了什么?
我怎样才能解决这个问题?
更新:
有一个PyTest插件可以用来解决这个问题:https://github.com/TvoroG/pytest-lazy-fixture.
后pip
-installing这个插件,上述代码的唯一必要的改变如下:
@pytest.fixture(params=[pytest.lazy_fixture('lower'),
pytest.lazy_fixture('upper')])
def all(request):
return request.param
Run Code Online (Sandbox Code Playgroud)
但请注意,与当前的PyTest版本3.6.3不兼容,请参阅 …
我想解析一个输入字符串并确定它是否包含由双引号 ( "
)包围的字符序列。字符序列本身不允许包含进一步的双引号,除非它们是由一个反斜线,像这样:\"
。
为了让事情变得更加复杂,反斜杠可以逃脱自己,像这样:\\
。\\"
因此不会转义以两个(或任意偶数个)反斜杠 ( )开头的双引号。更糟糕的是,允许使用单个非转义反斜杠(即后跟 none"
或\
)。
我试图用 Python 的re
模块来解决这个问题。该模块文件告诉我们关于管道运营商A|B
:
扫描目标字符串时,
'|'
会从左到右尝试分隔 的 RE 。当一个模式完全匹配时,该分支被接受。这意味着一旦A
匹配,B
将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,'|'
运营商从不贪婪。
但是,这并不像我预期的那样工作:
>>> import re
>>> re.match(r'"(\\[\\"]|[^"])*"', r'"a\"')
<_sre.SRE_Match object; span=(0, 4), match='"a\\"'>
Run Code Online (Sandbox Code Playgroud)
这个正则表达式的想法是首先检查转义字符(\\
或\"
),只有在没有找到的情况下,才检查任何没有找到的字符"
(但它可能是单个\
)。这可以发生任意次,并且必须用文字"
字符包围。
我希望字符串"a\"
根本不匹配,但显然确实如此。我希望\"
匹配A
零件和B
未测试的零件,但显然是这样。
我真的不知道在这种情况下回溯是如何工作的,但是有没有办法避免它?
我想如果我"
在单独的步骤中首先检查初始字符(并将其从输入中删除),它会起作用。然后我可以使用以下正则表达式来获取字符串的内容:
>>> re.match(r'(\\[\\"]|[^"])*', r'a\"')
<_sre.SRE_Match object; …
Run Code Online (Sandbox Code Playgroud) 生成器可以管理资源,例如通过yield
从上下文管理器内部进行操作。一旦close()
调用生成器的方法(或引发异常),资源就会被释放。
由于很容易忘记close()
最后调用,我认为显然也可以使用上下文管理器(并且还可以处理潜在的异常)。我知道我可以使用contextlib.closing
它,但是直接在语句中使用生成器不是更好吗with
?
生成器不应该是上下文管理器有什么原因吗?