如何将None类型转换为整数或字符串?

140 投票
10 回答
433404 浏览
提问于 2025-04-16 05:28

我有一个叫 x 的值,它通常是一个数字,但有时候可能是 None。我想把它除以一个数字,但 Python 报错了:

TypeError: int() argument must be a string or a number, not 'NoneType'

我该怎么解决这个问题呢?

10 个回答

18

处理这种情况时,Python中常用的一种方法叫做EAFP,意思是“请求原谅比请求许可更简单”。这通常意味着你写的代码假设一切都正常,但会用一个try...except块把它包裹起来,以防万一出现问题。

下面是这种编码风格应用到你问题上的例子:

try:
    my_value = int(my_value)
except TypeError:
    my_value = 0  # or whatever you want to do

answer = my_value / divisor

或者可能还有一种更简单、稍微快一点的写法:

try:
    answer = int(my_value) / divisor
except TypeError:
    answer = 0

与此相对,更传统的方法叫做LBYL,意思是“跳之前先看看”,这是@Soviut和其他一些人建议的。想了解更多这个话题,可以看看我在这个网站上关于这个问题的回答,以及与问题判断字典中是否存在某个键相关的评论。

使用EAFP可能会有一个潜在的问题,就是它可能掩盖了你代码的其他部分或你使用的第三方模块中存在的问题,尤其是当异常经常发生时(因此这些情况根本就不算“例外”)。

431
int(value or 0)

当你提供任何Python认为是False的值时,比如None、0、空列表([])、空字符串("")等,这个会用0来替代。因为0本身就是False,所以你只能把0作为替代值使用(否则你会发现你的0变成了那个值)。

int(0 if value is None else value)

这个只把None替换成0。因为我们是专门在检查None,所以你可以用其他值来替代。

57

在其中一个评论里,你提到:

我得到了一个 Nonetype 值,本来应该是一个整数,但现在变成了 Nonetype 对象。

如果这是你的代码,找出为什么在你期待得到一个数字的时候却得到了 None,并且要阻止这种情况发生。

如果是别人的代码,看看在什么情况下会返回 None,然后想一个合适的值来替代它,通常可以用条件语句来处理:

result = could_return_none(x)

if result is None:
    result = DEFAULT_VALUE

...或者甚至...

if x == THING_THAT_RESULTS_IN_NONE:
    result = DEFAULT_VALUE
else:
    result = could_return_none(x) # But it won't return None, because we've restricted the domain.

这里没有理由自动使用 0 — 依赖于 None 的“假”特性来解决问题的方案假设你会想要这样做。DEFAULT_VALUE(如果存在的话)完全取决于你代码的目的。

撰写回答