如何将涉及None的所有python操作转换为None值?

时间:2016-07-25 22:42:23

标签: python nonetype

我希望所有涉及一个或多个None变量的数学运算都返回None。

示例:

a = None
b = 7
a*b 

我希望最后一行返回None,但它反过来给我一个错误:

  

TypeError:*不支持的操作数类型*:'NoneType'和'int'

我理解为什么会出现此错误以及所有这些错误,但有没有办法强制结果只是None

背景:我有一些函数可以挖掘数据并返回一个名为diff的值。稍后我将diff相乘或添加到一些内容以获取有意义的信息,但并非所有原始数据都包含有用的diff,因此我将其设置为在这些中返回diff = None案例。我希望能够在绘制结果时跳过这些点。在我绘图时,Python似乎在跳过数组中的None元素时没有问题,所以我想让操作的结果为None

3 个答案:

答案 0 :(得分:6)

不是试图强制包含任意其他值的所有数学运算来返回任意其他值,而是可以简单地使用material-icons-css,这是出于这种目的而设计的:

>>> nan = float("NaN")
>>> 7 * nan
nan
>>> 7 + nan
nan

nan将在整个数学运算中正确级联。

一个好的绘图库也会理解nan并在绘图时省略它们。但如果没有,只需在绘图前立即将NaN替换为None

答案 1 :(得分:0)

您可以检查参数中是否存在None,然后提前返回:

def calc(*args, **kwargs):
    if None in list(args) + list(kwargs.keys()):
        return None
    #rest

您也可以编写装饰器并包装现有函数,如果您想将此操作应用于许多现有函数(或者为了清晰起见,甚至只需要一个函数),这将更有用:

def return_none_for_none(f):
    def wrapped(*args, **kwargs):
        return None if None in list(args) + list(kwargs.keys()) else f(*args, **kwargs)
    return wrapped


@return_none_for_none
def some_math_exp(a, b, c=2):
    return a + b*c

答案 2 :(得分:0)

没有太多的代码结构上下文;我假设你只想尝试一个操作,如果不可能则返回None。

也许try / except可以在这里工作:

try:
    # operation here
except TypeError:
    return None

但是我同意 @donkopotamus ,使用NaN浮点值完全符合您的要求。如果您尝试评估的表达式包含NaN,那么整个表达式的计算结果为NaN。如果找到None,您可以随时返回NaN,或者在将数据传递给数学库时转换数据。

>>> nan = float('NaN')
>>> nan + 15 ** 4
nan
>>> 1000 - nan /6%3
nan
>>>