Bra*_*ant 67 python lines-of-code exception
在python中有一种方法可以将try/except转换为单行吗?
就像是...
b = 'some variable'
a = c | b #try statement goes here
Run Code Online (Sandbox Code Playgroud)
b声明的变量在哪里而c不是......所以c会抛出一个错误并且a会变成b......
Wal*_*ndt 70
这非常hackish,但是当我想编写一系列调试操作时,我已经在提示符下使用它:
exec "try: some_problematic_thing()\nexcept: problem=sys.exc_info()"
print "The problem is %s" % problem[1]
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,我并没有受到无单线试试除外限制的困扰,但是当我只是在尝试时,我希望readline在交互式解释器中同时回忆一大堆代码所以我可以以某种方式调整它,这个小技巧派上用场.
对于你想要完成的实际目的,你可能会尝试locals().get('c', b); 理想情况下,最好使用真正的字典而不是本地上下文,或者在运行可能或不可能设置之前将c分配给None.
Mik*_*ham 50
没有办法在Python中将try/ exceptblock 压缩到一行.
另外,不知道Python中是否存在变量是一件坏事,就像在其他动态语言中一样.更安全的方式(和流行的风格)是将所有变量设置为某种东西.如果他们可能就不会置,将它们设置为None第一(或0或''或如果它是更适用的东西.)
如果您确实首先分配了您感兴趣的所有名称,那么您确实有选项.
最好的选择是if语句.
c = None
b = [1, 2]
if c is None:
a = b
else:
a = c
Run Code Online (Sandbox Code Playgroud)单行选项是条件表达式.
c = None
b = [1, 2]
a = c if c is not None else b
Run Code Online (Sandbox Code Playgroud)有些人滥用短路行为or来做到这一点.这很容易出错,所以我从不使用它.
c = None
b = [1, 2]
a = c or b
Run Code Online (Sandbox Code Playgroud)
考虑以下情况:
c = []
b = [1, 2]
a = c or b
Run Code Online (Sandbox Code Playgroud)
在这种情况下,a可能应该是[],但这是[1, 2]因为[]在布尔上下文中是假的.因为有很多值可能是假的,所以我不使用这个or技巧.(当他们说出if foo:他们的意思时,这是人们遇到的同样问题if foo is not None:.)
dse*_*t0x 14
在python3中,您可以使用contextlib.suppress:
from contextlib import suppress
d = {}
with suppress(KeyError): d['foo']
Run Code Online (Sandbox Code Playgroud)
Pav*_*kov 14
poke53280 版本的答案有限,预期例外。
def try_or(func, default=None, expected_exc=(Exception,)):
try:
return func()
except expected_exc:
return default
Run Code Online (Sandbox Code Playgroud)
它可以用作
In [2]: try_or(lambda: 1/2, default=float('nan'))
Out[2]: 0.5
In [3]: try_or(lambda: 1/0, default=float('nan'), expected_exc=(ArithmeticError,))
Out[3]: nan
In [4]: try_or(lambda: "1"/0, default=float('nan'), expected_exc=(ArithmeticError,))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
[your traceback here]
TypeError: unsupported operand type(s) for /: 'str' and 'int'
In [5]: try_or(lambda: "1"/0, default=float('nan'), expected_exc=(ArithmeticError, TypeError))
Out[5]: nan
Run Code Online (Sandbox Code Playgroud)
小智 12
另一种方法是定义上下文管理器:
class trialContextManager:
def __enter__(self): pass
def __exit__(self, *args): return True
trial = trialContextManager()
Run Code Online (Sandbox Code Playgroud)
然后使用该with语句忽略一行中的错误:
>>> with trial: a = 5 # will be executed normally
>>> with trial: a = 1 / 0 # will be not executed and no exception is raised
>>> print a
5
Run Code Online (Sandbox Code Playgroud)
在运行时错误的情况下不会引发异常.这就像try:没有了except:.
适用于 Python3,灵感来自 Walter Mundt
exec("try:some_problematic_thing()\nexcept:pass")
Run Code Online (Sandbox Code Playgroud)
将多行合并为一行
exec("try:\n\tprint('FirstLineOk')\n\tsome_problematic_thing()\n\tprint('ThirdLineNotTriggerd')\nexcept:pass")
Run Code Online (Sandbox Code Playgroud)
Ps:Exec 对于您无法控制的数据使用是不安全的。
小智 7
问题是它实际上是我正在尝试测试的 django model.objects.get 查询。如果没有找到数据, .get 返回一个错误......它不返回 None (这让我很恼火)
使用这样的东西:
print("result:", try_or(lambda: model.objects.get(), '<n/a>'))
Run Code Online (Sandbox Code Playgroud)
其中 try_or 是您定义的实用程序函数:
def try_or(fn, default):
try:
return fn()
except:
return default
Run Code Online (Sandbox Code Playgroud)
您也可以选择限制接受的异常类型NameError,AttributeError等等。
小智 7
parse_float = lambda x, y=exec("def f(s):\n try:\n return float(s)\n except: return None"): f(x)
Run Code Online (Sandbox Code Playgroud)
总有解决方案。
小智 7
使用两条线怎么样。可以吗?
>>> try: a = 3; b= 0; c = a / b
... except : print('not possible'); print('zero division error')
...
not possible
zero division error
Run Code Online (Sandbox Code Playgroud)
您可以通过使用vars()、locals()或访问命名空间字典来完成此操作globals(),以最适合您的情况为准。
>>> b = 'some variable'
>>> a = vars().get('c', b)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61926 次 |
| 最近记录: |