2016-04-16 17 views
10

Trong Python, có thể sử dụng một lớp lót để đặt giá trị với các điều kiện đặc biệt (như mặc định hoặc điều kiện) một cách đơn giản, trực quan.Xử lý ngoại lệ một dòng

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

result = "Found user!" if user in user_list else "User not found." 

Có thể viết một tuyên bố tương tự để bắt ngoại lệ không?

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. 
+2

Tại sao không đặt tiêu chuẩn 'try..except' vào chức năng? – TigerhawkT3

+0

@Slayer Thật thú vị, Python thực sự sẽ sử dụng một chuỗi (hoặc bất kỳ đối tượng nào khác, trên thực tế) như là một "thay thế" cho 'hoặc'. '0 hoặc" Không tồn tại. "' Sẽ trả về '" Không tồn tại. "'. (Tôi đã thử nghiệm nó.) – 2Cubed

+0

@ TigerhawkT3 Tôi không có quyền truy cập vào nội bộ của hàm 'divide_one_by' - giả sử rằng nó được định nghĩa trong một mô-đun riêng biệt mà tôi đang sử dụng làm phụ thuộc. – 2Cubed

Trả lời

14

Không thể thực hiện tuyên bố xử lý ngoại lệ một dòng trong python. Người ta có thể viết một hàm để làm điều này. sử dụng

def safe_execute(default, exception, function, *args): 
    try: 
     return function(*args) 
    except exception: 
     return default 

Ví dụ:

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 

Nhiều đối số được hỗ trợ

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. 

Quá trình lỗi bắt vẫn có thể bị gián đoạn:

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 

Nếu hành vi này là không mong muốn , sử dụng 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!" 
0

Có thể trong một dòng sử dụng exec:

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