Python 如何将非类型转换为int或string?
我有一个Python 如何将非类型转换为int或string?,python,Python,我有一个Nonetype值x,它通常是一个数字,但可以是None。我想将其除以一个数字,但Python提出: TypeError:int()参数必须是字符串或数字,而不是“NoneType” 如何解决此问题?只有在尝试传递int()时才会出现TypeError(据我所知,这是唯一的NoneType值)。我想说的是,你的真正目标不应该是将NoneType转换为int或str,而是找出你在哪里/为什么得到None,而不是预期的数字,并对其进行修复或正确处理None。在尝试对其执行任何计算之前,应检
Nonetype
值x
,它通常是一个数字,但可以是None
。我想将其除以一个数字,但Python提出:
TypeError:int()参数必须是字符串或数字,而不是“NoneType”
如何解决此问题?只有在尝试传递
int()时才会出现TypeError
(据我所知,这是唯一的NoneType
值)。我想说的是,你的真正目标不应该是将NoneType
转换为int
或str
,而是找出你在哪里/为什么得到None
,而不是预期的数字,并对其进行修复或正确处理None
。在尝试对其执行任何计算之前,应检查以确保该值不是None:
my_value = None
if my_value is not None:
print int(my_value) / 2
注意:我的\u值
被故意设置为“无”,以证明代码有效且正在执行检查
int(value or 0)
当您提供Python认为False
的任何值时,这将使用0,例如None、0、[]、“”等。因为0是False
,所以您应该只使用0作为替代值(否则您会发现0变成该值)
这仅将None
替换为0。由于我们测试的是None
,因此您可以使用其他值作为替换。如果您忘记从函数返回值,则可能会发生这种情况:然后它将返回None。查看分配给该变量的所有位置,看看其中是否有一个是缺少返回语句的函数调用。在其中一个注释中,您说:
不知怎的,我得到了一个非类型的值,它应该是int,但现在它是一个非类型的对象
如果是您的代码,请找出当您期望一个数字时,您是如何得到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\u值(如果存在)完全取决于代码的用途。处理这种情况的常用“Pythonic”方法称为EAFP,意思是“请求原谅比允许更容易”。这通常意味着编写假定一切正常的代码,然后用一个try…来包装它,除了
块来处理万一不正常的事情
以下是适用于您的问题的编码样式:
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的一个潜在问题是,它可以隐藏您正在使用的代码或第三方模块的其他部分出现问题的事实,尤其是在异常频繁发生的情况下(因此根本不是真正的“异常”情况).我在使用python电子邮件函数时遇到了同样的问题。
下面是我试图将电子邮件主题检索到变量中的代码。这适用于大多数电子邮件和变量填充。如果您收到来自Yahoo或类似机构的电子邮件,而发件人没有填写主题行,Yahoo不会在电子邮件中创建主题行,您将从函数返回一个非类型。马蒂诺提供了一个正确的答案和答案。从编程的角度来看,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()
我已经成功地将int(x或0)用于这种类型的错误,只要逻辑中没有一个应该等于0。
注意,在测试x返回False的其他情况下,这也将解析为0。e、 g.空列表、集合、字典或零长度字符串。
抱歉,Kindall已经给出了这个答案。在某些情况下,使用函数将None转换为int zero会很有帮助:
def nz(value):
'''
Convert None to int zero else return value.
'''
if value == None:
return 0
return value
在Python3中,您也可以使用“or”关键字。这样:
foo = bar or 0
foo2 = bar or ""
假设“无”等于2771。但也许那不是你想要的。请提供更多信息。不知何故,我得到了一个非类型值,它应该是一个int,但它现在是一个非类型对象,我需要除以另一个数字,然后出现错误。int(None)
引发异常,因为没有一个值无法转换为int。您的问题的答案是无法完成。你可以替换一些东西,比如0、2771或粉色大象,但无论你替换什么,你仍然无法将None转换为int。@ma3204。将None
转换为粉色大象也不好,除非您正在使用某种数字系统,该系统正式定义数字除以粉色大象(并且您已经编写了代码来备份),否则您应该使用标识比较(为[非]None
)-4你应该鼓励OP找出他的真正问题,而不是回避。谢伦说了些什么。您无条件地将my_值设置为None;为什么?当my\u value
通常是一个数字(如果不是None)时,你不会质疑OP为什么认为他需要执行int(my\u value)
。我将my\u值设置为None作为概念证明,以显示我的代码没有失败。我没有质疑OP,因为有很多原因可以解释为什么一个值不总是一个数字,在执行计算之前检查它是否是一个好主意。简单地回答OP的问题没有什么错,我不必为他们做所有的家庭作业。。。。o
foo = bar or 0
foo2 = bar or ""