首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查作为字符串存储的条件?我需要解析器吗?

如何检查作为字符串存储的条件?我需要解析器吗?
EN

Stack Overflow用户
提问于 2013-07-19 17:31:49
回答 6查看 2K关注 0票数 3

我有一些条件/比较作为字符串存储。怎样才能检查这些情况?下面给出了一个非常简单的例子。我希望条件是字符串,因为我想打印它们,以防它们失败。

我想我需要为此做一个解析器,但这是一个非常愚蠢的想法,为一件小事制作一个完整的Python解析器。有什么办法吗?

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-07-19 17:36:40

您可以使用eval(cond_string)来实现这一点。

代码语言:javascript
复制
for i in conditions:
     if eval(i):
           print(i)

编辑:是的,正如一些人指出的那样,如果不能完全确定您正在计算的字符串的内容,eval可能会很危险。因此,使用eval通常被认为是糟糕的通用实践,尽管它可能是实现您在这里的目标的最简单的方法。

如果您的目的是为代码维护目的执行正常检查,您还可以查看模块

票数 1
EN

Stack Overflow用户

发布于 2013-07-19 17:37:15

您可以使用eval,但我不建议这样做。如果您已经知道要执行几次对rev_num(x) != y的调用,只需创建一个辅助函数并使用一个元组列表来存储参数:

代码语言:javascript
复制
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))
票数 3
EN

Stack Overflow用户

发布于 2013-07-19 17:43:55

如果要打印用于调试的条件,则引发异常。这将给出一个完整的堆栈跟踪,包括引发异常的行号。它提供了你想要的所有好处,而没有任何缺点。

如果是非致命的,则引发警告。这仍然会给您一个堆栈跟踪和一个行号,但是它不会停止程序,您可以在发送时关闭警告。

如果要向用户显示条件?你不知道,那个错误信息对用户来说是无用的。展示更多的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17752163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档