我有一个Nonetype价值x,它通常是一个数字,但可能是None.我想用数字除以它,但Python提出:
TypeError: int() argument must be a string or a number, not 'NoneType'
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
kin*_*all 281
int(value or 0)
Run Code Online (Sandbox Code Playgroud)
当你提供Python考虑的任何值时,这将使用0 False,例如None,0,[],""等.因为0 False,你应该只使用0作为替代值(否则你会发现你的0变成那个价值).
int(0 if value is None else value)
Run Code Online (Sandbox Code Playgroud)
这仅取代None0.由于我们None专门测试,您可以使用其他值作为替换.
det*_*tly 47
在其中一条评论中,您说:
不知怎的,我得到了一个Nonetype值,它应该是一个int,但它现在是一个Nonetype对象
如果这是你的代码,那么None当你期望一个数字并且阻止它发生时,弄清楚你是如何获得的.
如果它是别人的代码,请找出它给出的条件,None并使用通常的条件代码确定用于该代码的合理值:
result = could_return_none(x)
if result is None:
result = DEFAULT_VALUE
Run Code Online (Sandbox Code Playgroud)
...甚至...
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.
Run Code Online (Sandbox Code Playgroud)
没有理由在0这里自动使用- 依赖于"假"的解决方案None假设你会想要这个.的DEFAULT_VALUE(如果存在的话)完全取决于你的代码的目的.
mar*_*eau 15
处理这种情况的一种常见的"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
Run Code Online (Sandbox Code Playgroud)
或者更简单,更快一点:
try:
answer = int(my_value) / divisor
except TypeError:
answer = 0
Run Code Online (Sandbox Code Playgroud)
反向和更传统的方法被称为LBYL,它代表着" 在你跳跃之前看 "是@Soviut和其他一些人所建议的.有关此主题的其他内容,请参阅我的答案以及与该问题相关的评论确定该站点上其他地方的字典中是否存在密钥.
EAFP的一个潜在问题是,它可以隐藏您正在使用的代码的某些其他部分或第三方模块出现问题的事实,尤其是在异常经常发生时(因此并非真正的"例外"情况)在所有).
waf*_*dox 11
这TypeError只会在你尝试传递时出现int() None(NoneType据我所知,这是唯一的值).我会说你的真正目标不应该转换NoneType为int或者str,而是要弄清楚你在哪里/为什么得到None而不是预期的数字,并修复它或None正确处理.
在 Python 3 中,您也可以使用“or”关键字。这边走:
foo = bar or 0
foo2 = bar or ""
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
211694 次 |
| 最近记录: |