它似乎会导致一个异常,如在程序中做一个快速和懒惰的代码中止将不至于。raise Exception
. 但在快速发展的过程中,更好的成语可能是找到一个更方便的错误。
你可以用5个字符做得更快,如果你清楚地意识到 IndexError
作为一个占位符 [][0]
.
但是,一个人可以做得更好,4个字符与 []-0
并产生 TypeError
.
现在,我们改进为3个字符与 -[]
或 +[]
这也是 TypeError
. 所有这些带有字符串和元组的变体都是可能的。
在Python中,语法上有效的代码可以用2个或更少的字符抛出一个无依赖和隔离的异常吗? 这意味着不需要定义变量,在任何地方都可以工作,所以不使用任何单字母变量名,否则的话 a
会抛出 NameError
但显然如果 a
变量在程序中使用,它将无法工作。
我至少可以找到上面的3个字符组合,这可能是一个非常快速和短手开发时间的唯一方法,仅仅是为了快速测试代码而中止。
更新:我想到了一个主意,可以详尽地回答这个问题,所以我就去做了。 无可否认,这是一个有点像代码高尔夫风格的问题,但它还是很有趣的。
为了得到一个特定的异常,你可以在其他地方跟踪,你可以定义一个单字母变量,其中包含一个自定义异常类的实例,当反转操作符被应用到它身上时,它就会自己引发异常。
class CustomError(Exception):
def __invert__(self):
raise self
É = CustomError() # Unlikely to be used elsewhere single letter variable.
usage:
~É ==> raises a CustomError exception
好吧,我意识到这可以写在一个详尽的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个保证异常生成程序呢!