引起Python异常的最少的语法正确字符数。

问题描述 投票:1回答:1

它似乎会导致一个异常,如在程序中做一个快速和懒惰的代码中止将不至于。raise Exception. 但在快速发展的过程中,更好的成语可能是找到一个更方便的错误。

你可以用5个字符做得更快,如果你清楚地意识到 IndexError 作为一个占位符 [][0].

但是,一个人可以做得更好,4个字符与 []-0 并产生 TypeError.

现在,我们改进为3个字符与 -[]+[] 这也是 TypeError. 所有这些带有字符串和元组的变体都是可能的。

在Python中,语法上有效的代码可以用2个或更少的字符抛出一个无依赖和隔离的异常吗? 这意味着不需要定义变量,在任何地方都可以工作,所以不使用任何单字母变量名,否则的话 a 会抛出 NameError 但显然如果 a 变量在程序中使用,它将无法工作。

我至少可以找到上面的3个字符组合,这可能是一个非常快速和短手开发时间的唯一方法,仅仅是为了快速测试代码而中止。

更新:我想到了一个主意,可以详尽地回答这个问题,所以我就去做了。 无可否认,这是一个有点像代码高尔夫风格的问题,但它还是很有趣的。

python exception syntax
1个回答
1
投票

为了得到一个特定的异常,你可以在其他地方跟踪,你可以定义一个单字母变量,其中包含一个自定义异常类的实例,当反转操作符被应用到它身上时,它就会自己引发异常。

class CustomError(Exception): 

    def __invert__(self):
        raise self  

É = CustomError()  # Unlikely to be used elsewhere single letter variable.

usage:

~É  ==> raises a CustomError exception

1
投票

好吧,我意识到这可以写在一个详尽的ASCII字符枚举程序中,这个程序不仅写起来简单,而且由python来评估。 然而,这个 _ 关键字显然是python解释中的一个特殊符号,它是最后一个表达式的结果,所以必须在一个新的实例中运行,之前没有执行过任何命令(除了导入和函数定义)。

def py_try(num):
  import itertools
  combs = {'TypeError':[], 'ZeroDivisionError':[]}
  for item in itertools.product(range(256), repeat=num):
    try:
      eval(bytes(item))
    except SyntaxError: pass
    except NameError: pass
    except ValueError: pass
    except Exception as e:
      print(e.__class__.__name__ + " " + bytes(item).decode("ascii"))
      combs[e.__class__.__name__].append(bytes(item).decode("ascii"))
  return combs
solution=py_try(3)
len(solution['ZeroDivisionError']) #20
len(solution['TypeError']) #168

2个字符从来没有用过。 但如果是3个字符,你会得到以下内容,为了方便,这些内容被表示为正则表达式(语法上只有 []|-):

[\-|+|~][\[\]|{}|\\|id|""|''] - 18种可能的组合 TypeError.

任何 [0-9]/0[0-9]%0 产生10+10的组合 ZeroDivisionError.

任何 ~[0-9]j, *[0-9], ~[0-9].~.[0-9] 增加了10+10+10+10的可能性。TypeError.

任何 [0-9]@[0-9] 这就产生了100种组合 TypeError.

任何 [0-9]() 这给出了10个组合,每个组合有一个 SyntaxWarning: 'int' object is not callable; perhaps you missed a comma? 临投 TypeError

所以20 ZeroDivisionError 和168 TypeError 是可能的。

谁能想到仅用3个字符就能写出这么多的188个保证异常生成程序呢!

© www.soinside.com 2019 - 2024. All rights reserved.