关于python:如何将Nonetype转换为int或string?

How to convert Nonetype to int or string?

我有一个Nonetypex,通常是一个数字,但可以是None。我想把它除以一个数字,但python提出:

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

我怎么解决这个问题?

  • 假设没有一个等于2771。但也许这不是你想要的。请提供更多信息。
  • 不知怎么的,我得到了一个非类型的值,它应该是一个int,但它现在是一个非类型的对象,我需要除以另一个数字,然后错误就出现了。
  • int(None)抛出了一个异常,因为没有一个不能转换成int。您的问题的答案是它不能完成。你可以用0或者2771或者粉红的大象来代替,但是不管你用什么代替,你仍然不能将它们转换成int。
  • @MA3204。把None转换成粉红大象也不好,除非你正在使用一个正式定义粉红大象对数字进行除法的数字系统(并且你已经编写了代码来备份它)。


1
int(value or 0)

如果您提供了python认为False的任何值,例如none、0、[]"等,则将使用0。由于0是False,因此您只应使用0作为可选值(否则,您将发现0正在转换为该值)。

1
int(0 if value is None else value)

这只将None替换为0。因为我们专门测试None,所以您可以使用其他值作为替换。

  • 用户469652您应该考虑将其作为公认的答案。它实际上是有帮助的,而不是屈尊俯就。
  • 我不确定这是否解决了用户所面临的问题,也就是说,使用nonetype来执行计算…我目前正在通过一个RESTAPI提取数据,该API返回一个包含数值的nonetype。如果我把它设为0或保持原样,我就不能用它做任何事
  • 所以我必须在我的代码中找到错误
  • 这无疑是最好的答案,因为问题是,正如用户所指出的那样,不应该像函数一样,请求返回"无"的值来表示未知值。在这种情况下,"无"应该成为其使用情况下的默认值,通常为0。考虑Izip_longer,default参数,如果不同的参数有不同的默认值(偶数类型),那么默认值应该是none,然后用默认值替换,但是字符串(str,w)只取整数作为宽度。
  • 用了这个,它很优雅,解决了我的问题。
  • 这很有用,又整洁又聪明
  • 我们可以使用(value or 0)—不使用int类型的强制转换—如果我们保证值只能是none或int


在其中一条评论中,你说:

Somehow I got an Nonetype value, it supposed to be an int, but it's now a Nonetype object

如果这是你的代码,当你期望一个数字的时候,弄清楚你是如何得到None,并阻止它的发生。

如果是别人的代码,找出它给None的条件,并用通常的条件代码确定一个合理的值:

1
2
3
4
result = could_return_none(x)

if result is None:
    result = DEFAULT_VALUE

…甚至…

1
2
3
4
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(如果它甚至存在)完全取决于代码的用途。

  • +1表示"正确"的解决方案。如果你的窗户经常神秘地坏掉,找出原因(并抓住肇事者),而不是把窗户堵起来;)
  • 例如,当您从Redis字典中检索密钥时,这并不有用,因为丢失的密钥将是"无"。如果您想对它们求和而不管它们是否存在(这是完全可以接受的行为),您可能需要将"无"转换为"0"(请参见Kindall答案)。
  • @蜘蛛-这仍然意味着它高度依赖于形势,"确定一个合理的价值"仍然适用。
  • 完全正确,完全同意:)
  • spider的观点是非常有效的。这个答案基本上只是说你做错了什么,但没有一个并不意味着它意味着未知的值,这可能意味着你做错了什么,或者正如spider建议的一个缺少的值,一般来说,它应该是0或者可能是1,对于大多数可能使用无的地方,整数是预期的。
  • @Glenflet如果你不知道你的函数的输入域和规范是什么,互联网上的陌生人就不会告诉你。如果你确实知道,但不知道转换它的语法,那么这个问题与这里提出的问题完全不同。


处理这种情况的一种常见的"Python式"方法被称为EAFP,因为"请求宽恕比请求允许更容易"。这通常意味着编写假定一切正常的代码,然后用try..except块包装它,以防在不正常的情况下处理问题。

下面是应用于您的问题的编码样式:

1
2
3
4
5
6
try:
    my_value = int(my_value)
except TypeError:
    my_value = 0  # or whatever you want to do

answer = my_value / divisor

或者更简单、更快:

1
2
3
4
try:
    answer = int(my_value) / divisor
except TypeError:
    answer = 0

相反的,更传统的方法被称为lbyl,它代表"三思而后行",这是@soviut和其他一些人提出的建议。有关此主题的更多内容,请参阅我对该问题的回答和相关评论,以确定此网站其他地方的词典中是否存在密钥。

EAFP的一个潜在问题是,它可以隐藏这样一个事实,即您正在使用的代码或第三方模块的某些其他部分有问题,特别是在异常频繁发生时(因此根本不是"异常"情况)。


只有当你试图通过int()None时,TypeError才出现(据我所知,这是唯一的NoneType值)。我想说的是,你的真正目标不应该是把NoneType转换成intstr,而是弄清楚你从哪里/为什么得到None,而不是像预期的那样得到一个数字,然后修复它或正确地处理None

  • 通过int()一个复数,如int(1+2j)也会引起TypeError的增加,尽管可以承认这很可能是不可能的。不管怎样,我认为你所说的将是,毫无疑问,一般都是好的建议。


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


在python 3中,也可以使用"or"关键字。这种方式:

1
2
foo = bar or 0
foo2 = bar or""


我在使用python电子邮件功能时遇到了同样的问题。下面是我试图将电子邮件主题检索到变量中的代码。这对大多数电子邮件都很有效,并且变量也很常见。如果您收到来自雅虎或类似公司的电子邮件,而发件人没有填写主题行,雅虎不会在电子邮件中创建主题行,并且您会从函数中得到一个非类型的返回。马蒂诺提供了一个正确的答案,同时也提供了苏维埃。从编程的角度来看,imo soviut的答案更简洁;不一定是从Python的角度来看。下面是一些代码来演示该技术:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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()

如果忘记从函数返回一个值,就会发生这种情况:然后它将不返回任何值。查看分配给该变量的所有地方,看看其中是否有一个是函数调用,而函数缺少返回语句。

  • …或者该函数有一个或多个返回语句,它们只是普通的return,而不是return some_expression
  • …或者函数包含一个或多个return None语句


在尝试对该值执行任何计算之前,应检查以确保该值不是"无":

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

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

  • 你应该使用身份比较(is [not] None)
  • -4你应该鼓励行动小组找出他真正的问题是什么,而不是回避它。她说什么?你把my_value无条件地设为无;为什么?当my_value是(如果不是)一个"一般数字"时,你不会怀疑为什么OP认为他需要做int(my_value)
  • 我将"值"设置为"无"作为概念证明,以显示我的代码没有失败。我没有质疑OP,因为有很多原因可以解释为什么一个值不一定是一个数字,并且在执行计算之前检查它是否是一个好主意。简单回答OP的问题没什么问题,我不必为他们做所有的家庭作业。


在某些情况下,使用函数将none转换为int zero很有帮助:

1
2
3
4
5
6
7
8
9
def nz(value):

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


    if value == None:
        return 0
    return value