小编Pet*_*vaz的帖子

是否可以在Python中进行代码覆盖率断言?

当我编写测试或调试代码时,我希望能够添加一行Python,如果该行从未执行过,它将通知我.这可能吗?

例如,我希望能够编写如下代码:

def f(x):
   if x==0:
      check_covered()
      return 1
   elif x==1:
      check_covered()
      return 2
   else:
      check_covered()
   return 3

f(1)
f(2)
print_all_missing_cases()
Run Code Online (Sandbox Code Playgroud)

我希望输出告诉我其中一个分支从未被覆盖过.

我试过的

方法1

我可以使用装饰器执行此操作,如下所示:

missing_fns = set()

def covered(h):
    missing_fns.add(h.func_name)
    def h2(*args):
        missing_fns.remove(h.func_name)
        return h(*args)
    return h2 

@covered
def f(a):
    return a+1

@covered
def g(a):
    return a+2

f(0)
for x in missing_fns:
    print x,'is never called'
Run Code Online (Sandbox Code Playgroud)

但我正在努力寻找在编译函数时激活的东西,我可以将其挂钩.

方法2

如果我将递增值传递给每个实例(例如check_covered(0),check_covered(1),check_covered(2),...),这也很简单,但是当我复制或删除代码时,这会变得很混乱.

方法3

可以通过运行代码覆盖率工具来获取此信息,但如果可能的话,我更愿意使用一些我有机会理解的简单Python代码来完成此操作.

python code-coverage coverage.py python-coverage

6
推荐指数
1
解决办法
149
查看次数

3 qbits的量子傅立叶变换代码

背景

我遇到了一个Javascript量子模拟器,并试图编写代码(即量子电路)来实现3 qbit量子傅立叶变换.

我能得到的最接近的如下所示: QFT结果

这是基于Nielsen和Chuang的"量子计算和量子信息"中关于QFT的章节.(电路末端的条件NOT门用于将输出位交换为正确的顺序 - QFT反转位的顺序.)

我也试过一个基于维基百科QFT文章的电路,但没有接近答案.

任何人都可以帮助纠正我的算法来计算QFT吗?

(我认为这个bug最有可能出现在我的电路中,但我想也可能是底层Javascript实现中存在错误?)

javascript algorithm fft quantum-computing

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

当使用-fwrapv时,gcc中的签名溢出仍然是未定义的行为吗?

背景

默认情况下,signed overflow是未定义的行为.

我对gcc的理解(基于https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html-wwrapv做了什么?)是使用-fwrapv使gcc将签名溢出视为定义良好行为.

但是,对另一个问题的评论似乎表明,即使打开此标志,签名溢出仍然是未定义的行为.

是否使用-fwrapv在gcc中定义了溢出?如果没有,那么-fwrapv的目的是什么?

c gcc language-lawyer

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

如何将读取器宏添加到Python?

背景

在Verilog中,我可以使用包含下划线的表达式指定二进制数.例如:

12'b1100_0111_0001 == 12'b110001110001  // The underscores are ignored
Run Code Online (Sandbox Code Playgroud)

我发现这是一个很好的功能,并希望将它添加到Python,所以我可以写如下:

x = 0b1100_0111_0001
y = 0x3fff_cc00
Run Code Online (Sandbox Code Playgroud)

在Lisp中,我可以使用set-dispatch-macro-character之类的东西来执行此操作,以便能够在通过读取器宏编译之前编辑源代码.

在Python中添加类似Lisp的读取器宏的好方法是什么?

对于使用我当前的方法或采用完全不同的方法解决问题的建议,我同样满意.

我试过的

我已经尝试将自定义finder对象添加到sys.meta_path.这几乎可以解决两个问题:

  1. 当我使用自定义查找器导入模块时,它不存储文件的pyc编译表示
  2. 理想情况下,我希望reader宏应用于顶级文件的其余部分,而不是将我的代码放入单独的文件"verilog_test_code.py"

源代码

verilog_test_code.py

def run_test():
    return 0b1100_0111_0001+0x3fff_cc00
Run Code Online (Sandbox Code Playgroud)

toplevel.py

import remove_underscores
import verilog_test_code
print verilog_test_code.run_test()
Run Code Online (Sandbox Code Playgroud)

remove_underscores.py

import tokenize,sys,imp

def remove_underscores(src):
    """Remove underscores from hexadecimals."""
    result = []
    g = tokenize.generate_tokens(src.readline)   
    for toknum, tokval, _, _, _  in g:
        if toknum == tokenize.NAME and tokval[0]=='_' and result and result[-1][0]==tokenize.NUMBER:
            result[-1][1] = str(result[-1][1]) + tokval[1:].replace('_','')
        else:
            result.append([toknum, …
Run Code Online (Sandbox Code Playgroud)

python

4
推荐指数
1
解决办法
205
查看次数