在Python中完全禁用/替换ZeroDivisionError

2024-09-30 10:39:01 发布

您现在位置:Python中文网/ 问答频道 /正文

再见。 我一直在搜索相关的帖子,但没有找到理想的解决方案。让我描述一下我的问题:

我从语料库中分析文本,并从这些文本中提取特征,然后将这些特征存储在一个数组中。其中一些特征涉及比例,例如男性代词“he”与女性代词“she”的比例。问题是,对于一些变量,值将为零,它们将产生零除法误差。在

因为我计算了大约100个这样的比率,所以在每个比率计算中包装try/catch异常听起来太麻烦了。在

我发现我能做到

#16,RATIO_masculine_femenine
feature_map.append(numOfHe / numOfShe if numOfShe else 0)

但还是有点太费劲了。 我想知道是否有一种方法可以在脚本请求时声明,任何zero divisionerror都应该用NaN或0或任何其他合适的值来代替。在

谢谢


Tags: 文本特征数组解决方案帖子比例比率he
2条回答

python的答案是将它包装在一个函数中,例如:

def ratio(a, b):
    if b == 0:
        return 0
    else:
        return a / b

feature_map.append(ratio(numOfHe, numOfShe))

函数的确切形式取决于其余的代码,但是如果你要写上几百次这样的代码,那么你应该把它包装在一个函数中,或者至少使用一个循环。另外,像numOfHenumOfShe这样的变量名暗示您最好使用dict

更新

我从你的代码链接中看到每个计算实际上是完全不同的,所以你可能不容易循环它。由于计算仍然相对简单,您可以尝试使用eval的技巧,如下所示:

^{pr2}$

您还可以将其他信息添加到calcs,并使用namedtuple。如果有帮助的话,您也可以使用类来动态评估calc。在

如果将int对象包装在自定义子类中,则可以对其寻址一次:

class SafeInt(int):
    def __div__(self, y):
        try:
            return SafeInt(super(SafeInt, self).__div__(y))
        except ZeroDivisionError:
            return SafeInt(0)

重写所有ints:

^{pr2}$

重写一些int

SafeInt(5) / 0
# O: 0

但是你要小心保护这个物体。您会注意到我在__div__中返回的所有内容都包装在SafeInt()中。int对象是不可变的,每次都必须显式地返回一个新的SafeInt对象。这意味着您可能需要为SafeInt()中的每个函数生成一个decorator来确保。我把这作为练习留给读者!在

否则你会得到这样的结果:

>>> SafeInt(5) / 0
0   # this is a SafeInt object
>>> _ / 0
0   # this is a SafeInt object; no error
>>> SafeInt(5) + 0
5   # this is a basic int object
>>> _ / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

最后一个注意事项:您可以将SafeInt作为参数传递给defaultdict,使所有成员SafeInt!在


编辑:知道你想让它发生在allints上,我希望这样的事情可能会奏效,但这是不允许的(有充分的理由):

>>> def wrapdiv(olddiv):
...     def newdiv(self, y):
...         try:
...             olddiv(self, y)
...         except ZeroDivisionError:
...             return 0
...     return newdiv
...
>>> int.__div__ = wrapdiv(int.__div__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'int'

相关问题 更多 >

    热门问题