我有一个Nonetype
价值x
,它通常是一个数字,但可能是None
.我想用数字除以它,但Python提出:
TypeError: int() argument must be a string or a number, not 'NoneType'
我怎么解决这个问题?
int(value or 0)
当你提供Python考虑的任何值时,这将使用0 False
,例如None,0,[],""等.因为0 False
,你应该只使用0作为替代值(否则你会发现你的0变成那个价值).
int(0 if value is None else value)
这仅取代None
0.由于我们None
专门测试,您可以使用其他值作为替换.
在其中一条评论中,您说:
不知怎的,我得到了一个Nonetype值,它应该是一个int,但它现在是一个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和其他一些人所建议的.有关此主题的其他内容,请参阅我的答案以及与该问题相关的评论确定该站点上其他地方的字典中是否存在密钥.
EAFP的一个潜在问题是,它可以隐藏您正在使用的代码的某些其他部分或第三方模块出现问题的事实,尤其是在异常经常发生时(因此并非真正的"例外"情况)在所有).
这TypeError
只会在你尝试传递时出现int()
None
(NoneType
据我所知,这是唯一的值).我会说你的真正目标不应该转换NoneType
为int
或者str
,而是要弄清楚你在哪里/为什么得到None
而不是预期的数字,并修复它或None
正确处理.