如何捕捉python脚本断言

是存在的,我们可以捕捉和记录一般Python脚本的断言语句,尽管断言在Python2.7任何方式是真的还是假 假设在代码中,我断言下面一行:如何捕捉python脚本" title="python脚本">python脚本断言

assert len(lst) ==4 

所以有什么方法可以记录什么语句传递,在哪一行,它是真或假。我不想使用包装函数,寻找python内置的东西。

注:我想要实现的是,假设我有遗留代码有1000个断言语句,而不更改代码,我应该能够记录哪个断言语句被执行以及输出是什么,是否可以实现python 2.7。

回答:

是的,你可以自定义一个excepthook记录一些额外的信息:

import sys 

import logging

def excepthook(*args):

logging.getLogger().error('Uncaught exception:', exc_info=args)

sys.excepthook = excepthook

assert 1==2

编辑:哎呀我忘了你想登录,即使这是真的:)哦,我会离开这个一点点如果它通知你或其他人...

回答:

try: 

assert len(lst) == 4

print "True"

except AssertionError as e:

print "False"

回答:

这是我可以实现closet,因为似乎不可能在Python2.7。我创建了一个包装函数。

import inspect 

def assertit(condition,message):

# The caller method

(frame, filename, line_number,function_name, lines, index) = inspect.getouterframes(inspect.currentframe())[1]

detailed_message=" => {message} [ {filename} : {line_number}]".format(message=message,line_number=line_number,

filename=filename)

if condition:

print "True %s"%detailed_message

return

raise AssertionError("False: %s"%detailed_message)

assertit(1==1,"Check if 1 equal 1")

assertit(1==2,"Check if 1 equal 2")

### HERE IS THE OUTPUT

True => Check if 1 equal 1 [ test_cases.py : 20]

Traceback (most recent call last):

File "test_cases.py", line 21, in <module>

assertit(1==2,"Check if 1 equal 2")

File "test_cases.py", line 19, in assertit

raise AssertionError("False: %s"%detailed_message)

AssertionError: False: => Check if 1 equal 2 [ test_cases.py : 21]

回答:

这是一个概念验证。所以请downvote,否则我会删除它... 这个想法是在执行时用print声明替换assert声明。

import ast 

import inspect

from your_module import main

def my_assert(test_result, msg):

assert test_result, msg

# if test_result is True, just print the msg

return "assert: {}, {}".format(test_result, msg)

class Transformer(ast.NodeTransformer):

def visit_Assert(self, node):

f = ast.Name(id='my_assert', ctx=ast.Load())

c = ast.Call(func=f, args=[node.test, node.msg], keywords=[])

p = ast.Print(values=[c], nl=True)

# set line#, column offset same as the original assert statement

f.lineno = c.lineno = p.lineno = node.lineno

f.col_offset =c.col_offset = p.col_offset = node.col_offset

return p

def replace_assert_with_print(func):

source = inspect.getsource(func)

ast_tree = ast.parse(source)

Transformer().visit(ast_tree)

return compile(ast_tree, filename="<ast>", mode="exec")

if __name__ == '__main__':

exec(replace_assert_with_print(main))

main(4)

这里是your_module.py

def main(x): 

assert x == 4, "hey {} is not 4".format(x)

return x

以上是 如何捕捉python脚本断言 的全部内容, 来源链接: utcz.com/qa/260786.html

回到顶部