我有一个Nonetype
值的x
,通常它是一个数字,但也可能是None
。我想将其除以一个数字,但Python会报错:
TypeError: int() argument must be a string or a number, not 'NoneType'
我该怎么解决这个问题?
我有一个Nonetype
值的x
,通常它是一个数字,但也可能是None
。我想将其除以一个数字,但Python会报错:
TypeError: int() argument must be a string or a number, not 'NoneType'
我该怎么解决这个问题?
int(value or 0)
如果你提供Python认为是False
的任何值,比如None、0、[]、""等,这将使用0。由于0是False
,因此你应该只使用0作为替代值(否则你会发现你的0变成了那个值)。
int(0 if value is None else value)
这样只会将None
替换为0。由于我们特别测试了None
,所以您可以使用其他值作为替换。
(value or 0)
-- 不需要进行int类型转换。 - hashlash如果这是您的代码,请找出如何在预期数字时获得某种方式我得到了一个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
(如果它真的存在)完全取决于您代码的目的。
处理这种情况的一个常见的“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和其他一些人建议的方法。有关此主题的其他内容,请参阅我的答案以及与本网站其他位置的Determine whether a key is present in a dictionary问题相关的评论。
EAFP的一个潜在问题是它可能隐藏了代码的其他部分或您使用的第三方模块出现了问题,特别是当异常经常发生时(因此根本不是“异常”情况)。
foo = bar or 0
foo2 = bar or ""
TypeError
只会在你试图将 int()
转换一个值为 None
的对象时(据我所知,None
是唯一的 NoneType
值),才会出现该错误。我认为你真正的目标不应该是将 NoneType
转换为 int
或 str
,而是要找出为什么会得到 None
,以及在哪里/为什么会得到它,然后修复它或正确处理掉 None
。
我曾经成功地使用int(x or 0)解决这种类型的错误,只要在逻辑上None应该等于0。 请注意,在其他情况下测试x返回False时,这也将解析为0。例如,空列表、集合、字典或零长度字符串。 抱歉,Kindall已经给出了这个答案。
import sys, email, email.Utils
afile = open(sys.argv[1], 'r')
m = email.message_from_file(afile)
subject = m["subject"]
# Soviut's Concise test for unset variable.
if subject is None:
subject = "[NO SUBJECT]"
# Alternative way to test for No Subject created in email (Thanks for NoneThing Yahoo!)
try:
if len(subject) == 0:
subject = "[NO SUBJECT]"
except TypeError:
subject = "[NO SUBJECT]"
print subject
afile.close()
my_value = None
if my_value is not None:
print int(my_value) / 2
注意: my_value
故意设置为 None,以证明代码有效,并且检查正在执行。
is [not] None
)。 - shylentmy_value
设置为None;为什么?当my_value
(如果不是None)“通常是一个数字”时,你不会质疑原帖作者为什么需要执行int(my_value)
。 - John Machinreturn None
语句 - John Machin在某些情况下,拥有一个将None转换为整数零的函数是有帮助的:
def nz(value):
'''
Convert None to int zero else return value.
'''
if value == None:
return 0
return value
int(None)
抛出异常,因为 None 无法转换为 int。你的问题的答案是它无法完成。你可以替换成其他东西,比如0、2771或者粉色大象,但无论你替换成什么,你仍然无法将 None 转换为 int。 - snapshoe