【问题标题】:Implementing error message for code in Python在 Python 中为代码实现错误消息
【发布时间】:2012-11-02 18:11:12
【问题描述】:
def parse(expression):
    operators= set("*/+-")
    numbers= set("0123456789")#not used anywhere as of now
    opExtrapolate= []
    numExtrapolate= []
    buff=[]
    for i in expression:
        if i in operators:
            if len(buff) >0: #prevents buff if multiple operators
                numExtrapolate.append(''.join(buff))
            buff= []
            opExtrapolate.append(i)
            opExtrapolation=opExtrapolate
        else:
            buff.append(i)


    numExtrapolate.append(''.join(buff))

    numExtrapolation=numExtrapolate
    print(numExtrapolation)
    print("z:", len(opExtrapolation))
    return numExtrapolation, opExtrapolation

def errors():

    numExtrapolation,opExtrapolation=parse(expression)
    #Error for muliple operators
    if (len(numExtrapolation) ==3) and (len(opExtrapolation) !=2):
        print("Bad1")
    if (len(numExtrapolation) ==2) and (len(opExtrapolation) !=1):
        print("Bad2")
    #

我在一个较旧的问题中发布了类似的代码,但是这篇文章中问题的前提不同。

上面的代码接受用户在变量表达式中输入的数学输入,并将其拆分为操作数和运算符。如果输入不正确,errors 函数稍后会打印错误。

输入看起来像这样,其中运算符只能在 set("*/+-") 中,并且操作数是实数。所以示例输入是 45/23+233

在 SO 用户的帮助下,我能够解决其中一个错误(多个操作员的错误),但我在执行更多错误消息时遇到了麻烦。

1)如果输入包含不是数字或不是允许的运算符的项目,则会显示错误消息

2)如果用户输入一个数字,例如 .23 或类似 554 的数字。如果小数位之前或小数位之后没有数字,则会显示不同的错误。(请注意,像 0.23 这样的数字很好)。

3)如果用户尝试除以零,则会显示错误。

::我尝试过的:

在 parse() 的 else 语句中,我尝试在 buff.append(i) 上设置条件,以便它仅在 buff.isdigit()==true 时运行该代码,但我收到错误消息说没有buff中的数字。我还尝试创建一个名为“numbers”的集合(在下面的代码中),并通过类似于初始 for 语句的 for 语句将 buff.append(i) 限制为该集合。但不幸的是,没有任何效果。任何和所有的帮助将不胜感激。

请不要引入大量比下面代码更高级的代码。我正在尝试解决问题,而不是完全更改我的代码。感谢您的所有帮助。

【问题讨论】:

  • 但是错误实现是额外的,不确定我是否会得到奖励。小数部分是强制性的。
  • 如果你建立一个Context Free Grammar而不是这个基于规则的系统,这将容易得多
  • 通过这篇文章的答案的含义,我希望学习如何操作我创建的列表(例如上面的 parse() )并将它们限制在某些条件下,即限制可以存储在我创建的列表中的输入类型。
  • 我支持@Austin 的评论...这非常适合 CFG ...
  • @Austin 你能提供一些关于 OP 的例子吗?我从未听说过 CFG,我点击了链接,但仍然不明白我将如何实现它。

标签: python implementation


【解决方案1】:

您可以使用正则表达式进行这些检查:

  1. 如果输入包含不是数字或不是允许的运算符的项目,则会显示错误消息

    if not re.match(r'[\d.*/+\- ]+$', expression):
        print("Bad3")  # Characters exist that are not allowed
    

    解释:[\d.*/+\- ] 将只匹配数字、运算符和空格,+ 表示允许其中一个或多个字符,$ 匹配字符串的最末尾。 re.match() 从字符串的开头开始,因此这意味着只允许使用这些字符。

  2. 如果用户输入诸如 0.23 或 554 之类的数字。如果小数位之前或小数位之后没有数字,则会显示不同的错误。(请注意,像 0.23 之类的数字也可以)。

    if re.search(r'(?<!\d)\.|\.(?!\d)', expression):
        print("Bad4")  # There is a '.' without a digit before or after it
    

    解释:正则表达式中的\. 匹配文字“。”特点。中间的| 是一个交替,所以如果它两边的表达式匹配,则正则表达式将匹配。 (?&lt;!\d) 表示前一个字符不是数字,(?!\d) 表示下一个字符不是数字,所以这个正则表达式的意思是“匹配一个'。”前面没有数字或匹配“。”后面没有数字”。

  3. 如果用户尝试除以零,则会显示错误。

    if re.search(r'/ *[0.]+(?![.\d])', expression):
        print("Bad5")  # Division by 0
    

    说明:这匹配 / 后跟任意数量的空格,然后是一个或多个 0. 字符,因此如果 expression 中的任何地方有类似 / 0、@987654338 的内容,这将匹配@,或/ 0.00(?![.\d]) 表示下一个字符不能是数字或.,这将阻止您匹配/ 0.4 之类的内容。

【讨论】:

  • re.x 代码超出了我的范围,是否有任何更简单的命令(可能会使代码更长)也可以工作?如果没有,那么您能否详细解释 re.x 代码中的内容以及它们的含义。如果我不能使用它,理解它不会伤害它。
  • 真的很好。今晚我正在学习一些东西。与他的编程技能相比,可能有点复杂:s
  • 增加了正则表达式的解释。
  • 正则表达式可能很复杂,但它们绝对是执行您正在寻找 OP 的各种检查的最佳和最简单的方法。理解那些 re.match 和 re.search 调用中的语法确实是棘手的部分,这一切都解释了here
【解决方案2】:

我会给你一些指示,但不会为你解决:)。 如果您需要更多,请提出一个准确的问题,我会回答。

我给你的答案与你的代码没有直接关系。

您可以通过尝试强制转换来测试字符串变量是否可以是整数:

try:
    var2 = int(var)

我让你看看它给出了什么错误

没有使用try的版本可以看isdigit method

您可以通过检查它来查看字符串变量是否是您的运算符之一

if (var in ["+", "-", "/", "*"])

要检查更多,您可以先查看变量的长度

if len(var) != and ... see above

检查用户是否输入了类似 .543 的内容并拒绝它,并且可以查看字符串变量的第一个元素:

if myvar[0] is ".":

要检查您的用户是否要除以 0,您可以简单地检查最后一个数字是否等于 0

if int(myvar) == 0:

所有这些都希望您能够首先获得运算符和数字。

另一种解决方案是在解析数字和运算符之前使用正则表达式来执行这些检查。 与您尝试完成的练习相比,它似乎相当复杂,因为它是家庭作业。无论如何,看看它们可能是个好主意。

【讨论】:

  • 您能否提供一个不使用“try”的示例,因为我仅限于可以使用的代码。我主要可以使用 string.manipulators 和 OP 代码中的任何内容。
  • 对不起,我读的是使用而不是不使用。哼,不知道该怎么做。
  • 您提到的关于解析数字的正则表达式的最后一点是我正在考虑做的事情,因为它使用基本代码,您能否扩展该主题。小数位代码的提及也很有用,我可以使用它,因为在我的代码中的其他地方我已经将我的代码拆分为单独的字符串。
  • 我为您提供了最简单的解决方案,F.J 为您提供了“正确”的方法。他的解决方案更好,因为它可以在假设您的输入结构之前执行。它也更复杂。只需选择适合您的情况;)
  • 我将如何实现一个 isdigit() 函数来检查是否为假,然后做点什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
相关资源
最近更新 更多