【问题标题】:How do I convert all python operations involving None to None values?如何将所有涉及 None 的 python 操作转换为 None 值?
【发布时间】:2016-11-29 10:18:47
【问题描述】:

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

例子:

a = None
b = 7
a*b 

我希望最后一行返回 None,但它却给了我一个错误:

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

我明白为什么会出现这个错误以及所有这些,但是有没有办法强制结果只是一个None

背景:我有几个函数可以挖掘数据并返回一个值,称为diff。稍后我将diff 乘以或添加到一些东西以获得有意义的信息,但并非我的所有原始数据都包含有用的diff,因此我将其设置为在这些情况下返回diff = None。我希望在绘制结果时能够跳过这些点。在我绘图时,Python 似乎可以轻松跳过数组中的 None 元素,所以我只想将运算结果设为 None

【问题讨论】:

标签: python nonetype


【解决方案1】:

您可以检查参数中是否存在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

【讨论】:

  • 为什么不简单地对if None in args or None in kwargs 使用两个成员资格检查,而不是从每个成员中创建一个列表,然后将它们组合成第三个?
  • 为什么要检查None 是否是kwargs 中的
【解决方案2】:

您可以简单地使用NaN,而不是试图强制所有包含任意其他值的数学运算返回该任意其他值,它就是为这种目的而设计的:

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

nan 将在您的数学运算中正确地级联。

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

【讨论】:

  • 正是我想要的。谢谢。
【解决方案3】:

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

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

try:
    # operation here
except TypeError:
    return None

不过,我同意 @donkopotamus 的观点,使用 NaN 浮点值完全可以满足您的需求。如果您尝试计算的表达式包含NaN,则整个表达式的计算结果为NaN。如果找到NaN,您总是可以返回None,或者在将数据传递给数学库时转换您的数据。

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

【讨论】:

  • 作为迂腐的nan 并不总是会导致父表达式计算为nan。考虑1**nannan**1。所有这些级联规则都是其他人仔细考虑过的,我们不必再猜测了 ;-)
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2013-10-27
  • 2019-09-01
  • 1970-01-01
  • 2021-04-01
相关资源
最近更新 更多