小编Mat*_*ias的帖子

如何使用语法高亮显示(作为输出单元格).py文件的内容?

我知道%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显示输出单元格中的源代码而不是寻呼机

ipython ipython-notebook

14
推荐指数
3
解决办法
3295
查看次数

如何在py.test中将几个参数化夹具连接成一个新的夹具?

如果我有两个参数化夹具,我怎么能创建一个单独的测试函数,首先用一个夹具的实例调用,然后用另一个夹具的实例调用?

我想创建一个以某种方式连接两个现有灯具的新灯具是有意义的.这适用于"普通"灯具,但我似乎无法使用参数化灯具.

这是我尝试过的简化示例:

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不兼容,请参阅 …

python fixtures pytest

10
推荐指数
2
解决办法
3646
查看次数

如何扫描允许转义字符的字符串文字?

我想解析一个输入字符串并确定它是否包含由双引号 ( ")包围的字符序列。字符序列本身不允许包含进一步的双引号,除非它们是由一个反斜线,像这样:\"

为了让事情变得更加复杂,反斜杠可以逃脱自己,像这样:\\\\"因此不会转义以两个(或任意偶数个)反斜杠 ( )开头的双引号。更糟糕的是,允许使用单个非转义反斜杠(即后跟 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)

python regex parsing escaping

5
推荐指数
1
解决办法
2547
查看次数

为什么生成器不是上下文管理器?

生成器可以管理资源,例如通过yield从上下文管理器内部进行操作。一旦close()调用生成器的方法(或引发异常),资源就会被释放。

由于很容易忘记close()最后调用,我认为显然也可以使用上下文管理器(并且还可以处理潜在的异常)。我知道我可以使用contextlib.closing它,但是直接在语句中使用生成器不是更好吗with

生成器不应该是上下文管理器有什么原因吗?

python generator contextmanager

3
推荐指数
1
解决办法
739
查看次数