将声明性测试转换为pytest断言

时间:2016-09-18 17:31:47

标签: python regex pytest

我有一个很长的脚本,里面装满了像这样的行

[UBInt8.parse, b"\x01", 0x01, None],
[UBInt8.build, 0x01, b"\x01", None],

我需要将它们通过正则表达式转换为

assert UBInt8.parse(b"\x01") == 0x01
assert UBInt8.build(0x01) == b"\x01"

列表总是长度为4. 1st为方法,2nd为其参数,3rd为返回值,4th为None。我已经使用正则表达式来解决类似的问题(有人制作了解析器)但我需要帮助编写格式化字符串:

Removing six.b from multiple files。这是我之前使用的代码,格式化表达式需要重写,我不会说正则表达式。 :(

import re
import os

indir = 'files'

for root, dirs, files in os.walk(indir):
    for f in files:
        fname = os.path.join(root, f)
        with open(fname) as f:
            txt = f.read()
        txt = re.sub(r'six\.(b\("[^"]*"\))', r'\1', txt)
        with open(fname, 'w') as f:
            f.write(txt)
        print(fname)

1 个答案:

答案 0 :(得分:1)

这是我想出的手动解析。没有正则表达式。

#!/usr/bin/python3

import re, os, sys

def processfile(fname):
    print(fname+'... ')
    with open(fname, 'rt') as f:
        txt = f.readlines()
    with open(fname+"-trans", 'wt') as f:
        for line in txt:
            items = list(map(str.strip, line.strip().strip(",[]").split(",")))
            if len(items) == 4:
                if items[1] == "None":
                    items[1] = ""
                if items[3] == "None":
                    o = "assert {0}({1}) == {2}".format(*items)
                else:
                    if items[1] == "":
                        o = "assert raises({0}) == {3}".format(*items)
                    else:
                        o = "assert raises({0}, {1}) == {3}".format(*items)

                f.write("        "+o+"\n")
            else:
                f.write(line)

processfile(sys.argv[1])