如何将Nonetype转换为int或字符串?


95

我有一个Nonetypex,通常是一个数字,但可能是None。我想将其除以数字,但是Python提出了:

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

我该如何解决?


5
假设“无”等于2771。但这也许不是您想要的。请提供更多信息。
JoshD 2010年

不知何故,我得到了一个N​​onetype值,它应该是一个int,但现在它是一个Nonetype对象,我需要除以另一个数字,然后出现错误。
user469652

int(None)抛出异常,因为None不能转换为int。您的问题的答案是无法完成。您可以替换为0或2771之类的东西,也可以替换为粉红色的大象,但是无论替换为什么,您仍然无法将None转换为int。
短靴

7
@ ma3204。转换None为粉红色的大象也没有好处,除非您正在使用一些数字系统来正式定义粉红色的大象对数字的除法(并且您已经编写了代码以备份它)
2010年

Answers:


48

在其中一项评论中,您说:

不知何故,我得到了一个N​​onetype值,它应该是一个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(如果存在的话)完全取决于你的代码的目的。


5
为“正确的”解决方案+1。如果您的窗户经常被神秘地打破,请找出原因(并追究责任者),而不是将窗户挡住;)

3
例如,在您从Redis字典中检索键时,这将没有用,因为丢失的键将为None。如果您想对它们进行汇总而不考虑它们的存在(这是完全可以接受的行为),则可能需要将None转换为0(请参见kindall答案)
Spider

1
@spider-这仍然意味着它高度依赖于情况,并且“确定明智的价值”仍然适用。
2013年

Spider的观点是完全正确的,这个答案基本上只是说您做错了什么,但是None并不意味着它意味着未知的值,这可能表明您做错了什么,或者因为Spider建议缺少一个值,通常应该为0或可能为1,用于在可能需要整数的情况下无的大多数可能用法。
格伦弗莱彻2015年

@glenflet如果您不知道函数的输入域和规范是什么,那么互联网上的陌生人将无法告诉您。如果您知道但不知道转换它的语法,则与这里提出的问题完全不同。
熟练地

310
int(value or 0)

如果您提供Python认为的任何值False,例如None,0,[],“”等False,则将使用0。由于0为,您仅应使用0作为替代值(否则您将找到0变成那个价值)。

int(0 if value is None else value)

仅替换None为0。由于我们正在None专门测试,因此您可以使用其他一些值作为替换值。


64
您应该考虑将其设为接受的答案。与居高临下相反,它实际上是有帮助的
令人赞叹的

我不确定这是否解决了用户面临的问题。使用nonetype进行计算...我目前正在通过rest api提取数据,该api返回一个包含数值的nonetype。如果我将其设置为0或保留原样,则无法对其进行任何操作
br3w5 2013年

2
在给定问题的情况下,这绝对是最好的答案,因为用户表明应该像预期的那样,希望用户返回None,就像一个函数一样,请求返回None的值,以表示该值未知,在这种情况下,None应该成为默认值在其使用情况下,通常为0。考虑izip_longest,默认参数,它的另一个参数具有不同的默认值(偶数类型),则默认值应为None,然后将其替换为默认值,但是替换为字符串。<align_n> (str,w)仅采用整数作为宽度。
Glen Fletcher

2
使用这个,它很优雅,解决了我的问题。
Dan Safee 2015年

1
我们可以使用(value or 0)-如果没有int类型转换,则可以确保值只能是None或int
hashlash

16

一种常见的处理此类情况的“ Python式”方法称为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的一个潜在问题是,它可以掩盖您正在使用的代码或第三方模块的其他部分出了问题的事实,尤其是在经常发生异常的情况下(因此并非真正的“例外”情况)完全没有)。


11

TypeError仅当您尝试通过出现int() None(这是唯一的NoneType价值,因为据我所知)。我要说的是,您的真正目标不应该是转换NoneTypeintstr,而是要弄清楚您要从何处/为什么获得None该数字,而不是按预期的数字,然后对其进行修复或None正确处理。


传递int()一个复杂的数字(例如)int(1+2j)也将引起a的TypeError提高,尽管诚然这可能不太可能。无论如何,我想您会毫无疑问地遵循一般好的建议。
martineau

5

在Python 3中,您也可以使用“或”关键字。这条路:

foo = bar or 0
foo2 = bar or ""

2

我已经成功地将int(x或0)用于这种类型的错误,只要逻辑中None应该等于0。请注意,在测试x返回False的其他情况下,这也将解析为0。例如,空列表,集合,字典或零长度字符串。抱歉,金德尔已经给出了这个答案。


1

如果您忘记从函数返回值,则会发生这种情况:然后返回None。查看分配给该变量的所有位置,并查看其中是否有一个函数调用缺少函数return语句。


1
...或函数具有一个或多个return语句,这些语句只是普通格式return而不是return some_expression
约翰·马钦

...或函数包含一个或多个return None语句
John Machin 2010年

1

在尝试对其进行任何计算之前,应检查并确保该值不为 None:

my_value = None
if my_value is not None:
    print int(my_value) / 2

注意: my_value故意将其设置为“无”以证明代码有效并且正在执行检查。


1
您应该使用身份比较(is [not] None
shylent 2010年

-4您应该鼓励OP找出自己真正的问题,而不是避免它。@shylent怎么说。您my_value无条件设置为无;为什么?您不质疑为什么OP认为他需要在“通常是一个数字”(如果不是None)int(my_value)时需要做my_value
约翰·马钦

1
我将my_value设置为None作为概念证明,以显示我的代码不会失败。我没有质疑OP,因为有很多原因为什么一个值可能并不总是一个数字,在执行计算之前检查它是否是一个好主意。仅回答OP的问题并没有错,我不必为他们做所有的功课。
苏联2010年

1

我在使用python电子邮件功能时遇到了同样的问题。下面是我试图将电子邮件主题检索到变量中的代码。这对于大多数电子邮件都可以正常工作,并且会填充变量。如果您收到来自Yahoo等的电子邮件,但发件人没有填写主题行,Yahoo不会在电子邮件中创建主题行,并且您会从函数中返回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()

1

在某些情况下,具有将None转换为int零的函数会很有帮助:

def nz(value):

    '''
    Convert None to int zero else return value.
    '''

    if value == None:
        return 0
    return value
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.