是否有一种内置的或更具python风格的方法来尝试将字符串解析为整数
在尝试将字符串解析为整数时,我必须编写以下函数才能正常地失败。我可以想象Python内置了一些东西来实现这一点,但我找不到它。如果没有,是否有一种更具python风格的方法不需要单独的函数是否有一种内置的或更具python风格的方法来尝试将字符串解析为整数,python,parsing,integer,Python,Parsing,Integer,在尝试将字符串解析为整数时,我必须编写以下函数才能正常地失败。我可以想象Python内置了一些东西来实现这一点,但我找不到它。如果没有,是否有一种更具python风格的方法不需要单独的函数 def try_parse_int(s, base=10, val=None): try: return int(s, base) except ValueError: return val 我最终使用的解决方案是对@sharjeel答案的修改。以下内容在功能上完全相同,但我认为更具
def try_parse_int(s, base=10, val=None):
try:
return int(s, base)
except ValueError:
return val
我最终使用的解决方案是对@sharjeel答案的修改。以下内容在功能上完全相同,但我认为更具可读性
def ignore_exception(exception=Exception, default_val=None):
"""Returns a decorator that ignores an exception raised by the function it
decorates.
Using it as a decorator:
@ignore_exception(ValueError)
def my_function():
pass
Using it as a function wrapper:
int_try_parse = ignore_exception(ValueError)(int)
"""
def decorator(function):
def wrapper(*args, **kwargs):
try:
return function(*args, **kwargs)
except exception:
return default_val
return wrapper
return decorator
int()是内置的python方式,就像您在那里看到的一样
直接使用它通常更容易,也更常见:
def show_square(user_input):
"""Example of using int()."""
try:
num = int(user_input, 10)
except ValueError:
print "Error" # handle not-an-integer case
# or you may just want to raise an exception here
# or re-raise the ValueError
else:
print "Times two is", num * 2
def another_example(user_input):
try:
num = int(user_input, 10)
except ValueError:
num = default
print "Times two is", num * 2
不,它已经很完美了。不过,
val
参数可以更好地命名为default
在官方文件中记录为我会选择:
def parse_int(s, base=10, val=None):
if s.isdigit():
return int(s, base)
else:
return val
但这或多或少是一样的。这是蟒蛇式的方式。在python中,习惯使用EAFP样式-请求原谅比请求允许更容易。
这意味着您需要先尝试,然后在必要时清理混乱。这是一个非常常见的场景,因此我编写了一个“忽略异常”修饰符,它适用于所有类型的函数,这些函数都会抛出异常,而不是优雅地失败:
def ignore_exception(IgnoreException=Exception,DefaultVal=None):
""" Decorator for ignoring exception from a function
e.g. @ignore_exception(DivideByZero)
e.g.2. ignore_exception(DivideByZero)(Divide)(2/0)
"""
def dec(function):
def _dec(*args, **kwargs):
try:
return function(*args, **kwargs)
except IgnoreException:
return DefaultVal
return _dec
return dec
在您的情况下的用法:
sint = ignore_exception(ValueError)(int)
print sint("Hello World") # prints none
print sint("1340") # prints 1340
这可能是将字符串解析为int的另一种选择
while True:
try:
n = input("Please enter an integer: ")
n = int(n)
break
except ValueError:
print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")
实际上,有一个“内置的”单行解决方案,不需要引入新功能。因为我希望在这里找到这样一个答案,我补充说:
>>s=“123”
>>>i=int(s)如果s.isdigit()否则无
>>>印刷品(一)
123
>>>s=“abc”
>>>i=int(s)如果s.isdigit()否则无
>>>印刷品(一)
没有一个
>>>s=“”
>>>i=int(s)如果s.isdigit()否则无
>>>印刷品(一)
没有一个
>>>s=“1a”
>>>i=int(s)如果s.isdigit()否则无
>>>印刷品(一)
没有一个
另见不知道str.isdigit。这可能是有用的。谢谢。请考虑abyx的答案。他是对的,你应该使用你的代码,而不是我的。在这种情况下,EAFP样式不仅更合适,更符合Python风格,而且它可以处理负整数,而isdigit不能。如果可能的话,EAFP总是更好。我想提出这个建议,但我意识到unicode数字字符的大小写也丢失了,因此您必须使用unicode.isnumeric,并且str/unicode不再是对称的。还有十六进制的大小写也丢失了,现在需要.ishexdigit()。不,如果你能做XX,最好的办法是什么?试试做XX!这正是原始代码所说的:-)谢谢。不幸的是,没有内置的方法来解析一个不会引发异常的整数。@Christopher:为什么不幸?除了不是内置的,try是如何实现的?@Christopher:这就是Python的“文化”,我相信你会在其他领域找到同样的模式places@Roger,这是很不幸的,因为使用try-except会在我想要无提示失败的地方添加3行代码。dict的get方法体现了类似的精神,因为它不会引发异常。与编写自己的方法来处理这种情况不同,这似乎应该内置到Python语言中。例如,假设的方法调用int.try_parse('not integer',None')只会返回None,而不会引发ValueError。在问这个问题时,我希望有人会告诉我,事实上,确实存在类似的情况。”与其编写我自己的方法来处理这种情况,这似乎是Python语言中应该内置的东西“对不起,我不同意这一点。我已经用Python编写代码6年了。从来都不需要这种构造。你可以写一个函数,因为——很明显——你需要这个。@abyx:我喜欢前两句话。我不喜欢第三个。当你说“那么一旦你确定执行了动作”,听起来就像你在描述LBYL,尽管这句话的第一部分对于EAFP或多或少是正确的。我会说“EAFP=试试看,如果失败了就收拾残局”。虽然这很聪明,如果你打算用它装饰很多函数,它甚至可能有用,但它并没有回答主题行中所表达的问题。(主题行的答案是:没有内置的,OP的原始代码已经是最具python风格的方式。)是的,我同意约翰的观点,但我投票支持你使用切肉刀。这个答案和COBOL ALTER动词一样具有python风格。@Paul Hildebrandt:不仅很好,但这是最具python风格的。我认为你的例子对于展示装饰师的实际用途是非常有价值的。这不是个好主意。它产生虚假的结果。假设第5行上的缩进是固定的,则parseint('-3')=>3;parseint('2by2')=>22;请注意,由于循环中没有中断,因此始终执行第一次返回。
def parseint(string):
result = '0'
for x in string:
if x.isdigit():
result+=x
else:
return int(result)
return int(result)
myList = ['12', '13', '5', 'hope', 'despair', '69','0', '1.2']
myInts = [int(x) for x in myList if x.isdigit()]
while True:
try:
n = input("Please enter an integer: ")
n = int(n)
break
except ValueError:
print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")