Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单行异常处理_Python_Python 3.x_Exception_Exception Handling - Fatal编程技术网

Python 单行异常处理

Python 单行异常处理,python,python-3.x,exception,exception-handling,Python,Python 3.x,Exception,Exception Handling,在Python中,可以使用一行程序以简单直观的方式使用特殊条件(如默认值或条件)设置值 result = 0 or "Does not exist." # "Does not exist." result = "Found user!" if user in user_list else "User not found." 是否可以编写一个捕获异常的类似语句 from json import loads result = loads('{"value": true}') or "Oh n

在Python中,可以使用一行程序以简单直观的方式使用特殊条件(如默认值或条件)设置值

result = 0 or "Does not exist."  # "Does not exist."

result = "Found user!" if user in user_list else "User not found."
是否可以编写一个捕获异常的类似语句

from json import loads

result = loads('{"value": true}') or "Oh no, explosions occurred!"
# {'value': True}

result = loads(None) or "Oh no, explosions occurred!"
# "Oh no, explosions occurred!" is desired, but a TypeError is raised.

在python中不可能执行一行异常处理语句。可以编写一个函数来实现这一点

def safe_execute(default, exception, function, *args):
    try:
        return function(*args)
    except exception:
        return default
用法示例:

from json import loads
safe_execute("Oh no, explosions occurred!", TypeError, loads, None)
# Returns "Oh no, explosions occurred!"
safe_execute("Huh?", TypeError, int, "10")
#Returns 10
支持多个参数

from operator import div
safe_execute(
    "Divsion by zero is invalid.",
    ZeroDivisionError,
    div, 1, 0
)
# Returns "Divsion by zero is invalid."

safe_execute(
    "Divsion by zero is invalid.",
    ZeroDivisionError,
    div, 1, 1
)
# Returns 1.
错误捕获过程仍可能被中断:

from time import sleep
safe_execute(
    "Panic!",
    Exception,
    sleep, 8
)
# Ctrl-c will raise a KeyboardInterrupt

from sys import exit
safe_execute("Failed to exit!", Exception, exit)
# Exits the Python interpreter
如果此行为不受欢迎,请使用
BaseException

from time import sleep
safe_execute("interrupted",
             BaseException,
             sleep, 8)
#Pressing Ctrl-c will return "interrupted"
from sys import exit
safe_execute("Naughty little program!",
             BaseException,
             exit)
#Returns "Naughty little program!"

可以在一行中使用exec:

parse_float = lambda x, y=exec("def f(s):\n try:\n  return float(s)\n except:  return None"): f(x)

您可以使用
contextlib
抑制异常。如果你喜欢危险地生活,你可以抑制
BaseException
,这将抑制所有内置异常(可能是个坏主意)。或者你可以选择一个与你的代码相关的安全代码,比如
TypeError

示例:

from contextlib import suppress

# this will execute right along
with suppress(BaseException): fhasldjkfhsa345315

# even raising an Exception will fly just fine
with suppress(BaseException): raise NameError

# correct code will execute just fine
x=5
with suppress(BaseException): x+=2
print(x) # prints 7

# and in your example:
from json import loads
pleasure = suppress(TypeError) # so each line rolls off the tongue :)

with pleasure: result = loads('{"value": True}')
print(result) # prints {'value': True}

with pleasure: result = loads(None)
print(result) # prints {'value': True} because result never changed

为什么不把标准的
try..except
放到函数中呢?@Slayer有趣的是,Python实际上会使用字符串(或任何其他对象)作为
的“替代”对象<代码>0或“不存在”。
将返回
“不存在”。
。(我已经测试过了。)@TigerhawkT3我无法访问
除以
函数的内部结构-假设它是在一个单独的模块中定义的,我将其用作依赖项。@2Cubed:没有理由感到惊讶<对于
x
的所有值,除了
0
本身,code>0或x
的计算结果都是
x
。有一种方法可以添加类似的内容,但尚未被接受。您有一个很好的建议。我正试图为我的问题创建一个类似的解决方案,但代码无法工作。我已经详细说明了这个问题。如果您能检查这个问题并提供一些建议,我将不胜感激。