我有一些条件/比较作为字符串存储。怎样才能检查这些情况?下面给出了一个非常简单的例子。我希望条件是字符串,因为我想打印它们,以防它们失败。
我想我需要为此做一个解析器,但这是一个非常愚蠢的想法,为一件小事制作一个完整的Python解析器。有什么办法吗?
def rev_num(num):
if num < 0:
return -int(str(-num)[::-1])
else:
return int(str(num)[::-1])
conditions = ['rev_num(-34) != -43', 'rev_num(34) != 43']
for i in conditions:
if something-needs-to-come-here(i):
print(i)我知道这是个奇怪的主意,但如果可以的话,请跟我走。
我给user2357112造成了一些混乱。他指出,我想做的事叫做unit-testing。谢谢你这么说。
为了避免任何进一步的混淆,我将添加我正在努力改进的代码。我想要做的更改是在函数correctness中打印条件,使其返回False。
def rev_num(num):
if num < 0:
return -int(str(-num)[::-1])
else:
return int(str(num)[::-1])
if __name__ == "__main__":
from timeit import Timer
import random
def correctness(f):
print("Correctness Test")
if f(-34) != -43 or f(34) != 43:
return False
print('Correct')
print('-----------')
return True
def timing(f, times):
def test1(f):
f(random.randint(1, 1000))
def test2(f):
f(random.randint(100000, 1000000))
print("Timing Test")
print(Timer(lambda: test1(f)).timeit(number = times))
print(Timer(lambda: test2(f)).timeit(number = times))
print('-----------')
def tests(f,times):
print(f.__name__)
print('-----------')
if correctness(f) is True:
timing(f, times)
repeat = 100000
tests(rev_num, repeat)发布于 2013-07-19 17:36:40
您可以使用eval(cond_string)来实现这一点。
for i in conditions:
if eval(i):
print(i)编辑:是的,正如一些人指出的那样,如果不能完全确定您正在计算的字符串的内容,eval可能会很危险。因此,使用eval通常被认为是糟糕的通用实践,尽管它可能是实现您在这里的目标的最简单的方法。
如果您的目的是为代码维护目的执行正常检查,您还可以查看模块。
发布于 2013-07-19 17:37:15
您可以使用eval,但我不建议这样做。如果您已经知道要执行几次对rev_num(x) != y的调用,只需创建一个辅助函数并使用一个元组列表来存储参数:
def check_condition(x, y):
return rev_num(x) != y
conditions = [(-34, -43), (34, 43)]
for i in conditions:
if check_condition(*i):
print('rev_num({}) != {}'.format(*i))发布于 2013-07-19 17:43:55
如果要打印用于调试的条件,则引发异常。这将给出一个完整的堆栈跟踪,包括引发异常的行号。它提供了你想要的所有好处,而没有任何缺点。
如果是非致命的,则引发警告。这仍然会给您一个堆栈跟踪和一个行号,但是它不会停止程序,您可以在发送时关闭警告。
如果要向用户显示条件?你不知道,那个错误信息对用户来说是无用的。展示更多的信息。
https://stackoverflow.com/questions/17752163
复制相似问题