如何将Nonetype转换为int或string?
我有一个Nonetype
值x
,它通常是一个数字,但可以是None
。 我想把它分成一个数字,但Python提出:
TypeError: int() argument must be a string or a number, not 'NoneType'
我该如何解决这个问题?
在其中一个评论中,你说:
不知何故,我得到一个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
”的解决scheme假设你会想要这个。 DEFAULT_VALUE
(如果它存在的话)完全取决于你的代码的目的。
int(value or 0)
当你提供Python认为False
任何值时,例如None,0,[],“”等,这将使用0。由于0是False
,所以你只能使用0作为替代值(否则你会发现你的0变成了这个值)。
int(0 if value is None else value)
这只会将0replace为0.由于我们正在对“ None
专门testing,因此可以使用其他一些值作为replace。
处理这种情况的一种常见的“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 = my_value / divisor except TypeError: answer = 0
反过来和更传统的方法被称为LBYL ,代表“ 在你跳跃前看 ”是什么@Soviut和其他一些人build议。 有关此主题的其他内容,请参阅我的回答以及相关问题的评论。 确定密钥是否出现在本网站其他地方的字典中 。
EAFP的一个潜在的问题是,它可以隐藏你的代码或你使用的第三方模块的某些其他部分有问题的事实,尤其是当exception频繁发生时(因此不是真正的“例外”情况在所有)。
只有当你尝试传递int()
None
(这是唯一的NoneType
值,就我所知)而言, TypeError
才会出现。 我想说,你的真正目标不应该是将NoneType
转换为int
或str
,而是要弄清楚为什么你得到的是None
而不是像预期的那样,并且修正它或者正确地处理None
。
我已经成功地使用int(x或0)来处理这种types的错误,只要在逻辑中None应该等于0即可。 请注意,在xtesting返回False的情况下,这也将parsing为0。 例如空的列表,集合,字典或零长度的string。 对不起,Kindall已经给出了这个答案。
如果忘记从函数中返回一个值,就会发生这种情况:然后返回None。 查看分配给该variables的所有地方,并查看其中的一个是否是函数调用,其中函数没有返回语句。
我有使用python电子邮件function相同的问题。 下面是我试图将电子邮件主题检索到一个variables的代码。 这适用于大多数电子邮件和variables填充。 如果您收到来自雅虎等的电子邮件,并且发件人没有填写主题行,雅虎不会在电子邮件中创build主题行,并且您将获得从该函数返回的NoneType。 Martineau和Soviut一样提供了正确的答案。 国际海事组织(IMO Soviut)的答案从编程的angular度来看更为简洁。 不一定是从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()
在尝试执行任何计算之前,您应该检查以确保该值不是“无”
my_value = None if my_value is not None: print int(my_value) / 2
注意: my_value
被故意设置为None来certificate代码有效,并且正在执行检查。