如何捕捉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