是否有一种内置的或更具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答案的修改。以下内容在功能上完全相同,但我认为更具

在尝试将字符串解析为整数时,我必须编写以下函数才能正常地失败。我可以想象Python内置了一些东西来实现这一点,但我找不到它。如果没有,是否有一种更具python风格的方法不需要单独的函数

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!")