如何将Nonetype转换为int或string?

2024-04-26 21:01:53 发布

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

我有一个Nonetypex,它通常是一个数字,但可以是None。我想把它除以一个数字,但Python提出:

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

我该怎么解决?


Tags: ornonenumberstringnot数字beargument
3条回答
int(value or 0)

当您提供Python认为是False的任何值(例如None、0、[]、“”等)时,这将使用0。因为0是False,您应该只使用0作为替代值(否则您会发现您的0将变成该值)。

int(0 if value is None else value)

这只将None替换为0。因为我们是专门测试None,所以您可以使用其他值作为替换。

处理这种情况的一种常见的“Pythonic”方法被称为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和其他一些人的建议。有关此主题的其他内容,请参阅我的answer和本网站其他地方对问题Determine whether a key is present in a dictionary的相关评论。

EAFP的一个潜在问题是,它可以隐藏这样一个事实,即您正在使用的代码或第三方模块的某些其他部分出了问题,特别是当异常频繁发生时(因此根本不是真正的“异常”情况)。

在其中一条评论中,你说:

Somehow I got an Nonetype value, it supposed to be an int, but it's now a Nonetype object

如果是你的代码,找出当你期望一个数字时,你是如何得到的,并阻止它发生。

如果是其他人的代码,找出它给出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(如果它甚至存在)完全取决于代码的用途。

相关问题 更多 >