我有一个Nonetype
值x
,它通常是一个数字,但可能是None
。我想用数字除以它,但是Python提出了:
TypeError: int() argument must be a string or a number, not 'NoneType'
我该如何解决这个问题?
答案 0 :(得分:258)
int(value or 0)
当你提供Python认为False
的任何值时,这将使用0,例如None,0,[],“”等。由于0是False
,你应该只使用0作为替代值(否则你会发现你的0变为该值)。
int(0 if value is None else value)
这只会将None
替换为0.由于我们专门测试None
,您可以使用其他一些值作为替代。
答案 1 :(得分:42)
在其中一条评论中,您说:
不知怎的,我得到了一个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
(如果它存在)完全取决于您的代码的目的。
答案 2 :(得分:14)
处理这种情况的常见“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 的一个潜在问题是,它可以隐藏您正在使用的代码的某些其他部分或第三方模块出现问题的事实,尤其是在经常发生异常时(因此,根本不是真正的“例外”案件。
答案 3 :(得分:10)
TypeError
仅在您尝试传递int()
None
时出现(据我所知,这是唯一的NoneType
值)。我要说的是,您的真正目标不应该是将NoneType
转换为int
或str
,而是要找出您获得None
而不是数字的地点/原因正如所料,并修复它或正确处理None
。
答案 4 :(得分:2)
我已经成功地使用int(x或0)来处理这种类型的错误,只要在逻辑中None应该等于0。 请注意,在测试x返回False的其他情况下,这也将解析为0。例如空列表,集,字典或零长度字符串。 抱歉,Kindall已经给出了这个答案。
答案 5 :(得分:1)
在尝试对其执行任何计算之前,您应检查以确保该值不无:
my_value = None
if my_value is not None:
print int(my_value) / 2
注意: my_value
被故意设置为无以证明代码正常运行并且正在执行检查。
答案 6 :(得分:1)
如果您忘记从函数返回值,则会发生这种情况:然后返回None。查看您为该变量分配的所有位置,并查看其中一个是函数调用,其中函数缺少return语句。
答案 7 :(得分:1)
我在使用python电子邮件功能时遇到了同样的问题。 下面是我试图将电子邮件主题检索到变量的代码。这适用于大多数电子邮件和变量填充。如果您收到来自雅虎等的电子邮件且发件人未填写主题行,则雅虎不会在电子邮件中创建主题行,您将从该功能返回一个NoneType。 Martineau和Soviut提供了正确的答案。从编程角度来看,IMO Soviut的答案更为简洁;不一定来自Python。 以下是一些显示该技术的代码:
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()
答案 8 :(得分:1)
在Python 3中,您也可以使用“或”关键字。这样:
foo = bar or 0
foo2 = bar or ""
答案 9 :(得分:0)
在某些情况下,具有将None转换为int零的功能很有帮助:
def nz(value):
'''
Convert None to int zero else return value.
'''
if value == None:
return 0
return value