Tiếp tục sau khi trả về Python

Bởi Václav Brožík qua Thảo luận về Python. org lúc 12 tháng 8 năm 2022 21. 54

Tiếp tục sau khi trả về Python
Cameron Simpson

Điều này là để có một cơ chế xử lý các ngoại lệ (có nghĩa là
không nâng cấp chúng) từ logic trong câu lệnh cuối cùng

Nó thực sự là lý do?

Đó là những gì ngữ nghĩa đó làm

Tại sao PEP8 không khuyến khích sử dụng nó nếu nó được thiết kế như vậy?

Có rất nhiều thứ không được khuyến khích. Điều đó chỉ có nghĩa là bạn
nên tránh nó mà không có lý do chính đáng. Nói chung là như vậy mà mã
dễ đọc và có ngữ nghĩa “chung” hoặc “điển hình”. Khi bạn lấy
lộ trình bất thường mà bạn đang làm người đọc ngạc nhiên (hoặc đánh lừa họ nếu
họ nhớ rằng điều này là bất thường). Nhưng đôi khi đó là những gì được yêu cầu

Tôi không khuyến khích bạn đi theo con đường thông thường mà không có lời giải thích
bình luận

Tiếp tục sau khi trả về Python

Dù sao, đối với tôi nó có vẻ như là một thiết kế bẩn thỉu nếu một tác dụng phụ như vậy là
cố ý thêm vào các lệnh

Bạn sẽ ủng hộ việc không tăng lại ngoại lệ đang “sống” như thế nào
trong một mệnh đề finally?
Đây là một câu hỏi bán nghiêm trọng

  • bạn muốn một loại finally nào đó kích hoạt ngay cả khi mã
    bên trong try/except đưa ra một ngoại lệ
  • bạn có một trường hợp không nên tăng lại ngoại lệ đó

Ưu điểm của việc đưa điều khiển luồng vào finally
ngữ nghĩa là nó tránh sao chép (dễ bị lỗi và dài dòng) của
mã "dọn dẹp" hoặc "kế toán". Đề xuất thay thế của bạn là gì?

Chúc mừng,
Cameron Simpson cs@cskk. nhận dạng. âu

Bởi Václav Brožík qua Thảo luận về Python. org lúc 12 tháng 8 năm 2022 21. 54

Dù sao, đối với tôi nó có vẻ như là một thiết kế bẩn thỉu nếu một tác dụng phụ như vậy là
cố ý thêm vào các lệnh

Bạn sẽ ủng hộ việc không tăng lại ngoại lệ đang “sống” như thế nào
trong một mệnh đề finally?
Đây là một câu hỏi bán nghiêm trọng

  • bạn muốn một loại finally nào đó kích hoạt ngay cả khi mã
    bên trong try/except đưa ra một ngoại lệ
  • bạn có một trường hợp không nên tăng lại ngoại lệ đó

Chỉ muốn thêm vào điều này. Theo một số cách, mệnh đề except có nghịch đảo
ngữ nghĩa đối với mệnh đề finally bởi vì trong một except, “live”
ngoại lệ không được gọi lại trừ khi chúng tôi gọi

>>> for i in 1, 2, 3:
..   print(i)
..   try:
..     raise ValueError
..   finally:
..     print("finally 1")
..     break
..     print("finally 2")
...
1
finally 1
>>>
7

Do đó, bạn có thể ủng hộ điều đó trong finally, thay vì dựa vào

>>> for i in 1, 2, 3:
..   print(i)
..   try:
..     raise ValueError
..   finally:
..     print("finally 1")
..     break
..     print("finally 2")
...
1
finally 1
>>>
9 hoặc
try:
  something
except ValueError as e:
  if not funky_ok_value_error(e):
    raise
finally:
  print("something, or something not")
0, v.v. để ngăn chặn việc tăng lại, một cách tiếp cận rõ ràng hơn
có thể là một dạng đặc biệt của câu lệnh
>>> for i in 1, 2, 3:
..   print(i)
..   try:
..     raise ValueError
..   finally:
..     print("finally 1")
..     break
..     print("finally 2")
...
1
finally 1
>>>
7, ví dụ như
try:
  something
except ValueError as e:
  if not funky_ok_value_error(e):
    raise
finally:
  print("something, or something not")
2, mà
ngữ nghĩa có thể là thực hiện một số kiểu “tăng giả” thoát khỏi
Điều khoản finally nhưng sau đó tiếp tục thực hiện bên dưới
try:
  something
except ValueError as e:
  if not funky_ok_value_error(e):
    raise
finally:
  print("something, or something not")
4ngoại trừ
try:
  something
except ValueError as e:
  if not funky_ok_value_error(e):
    raise
finally:
  print("something, or something not")
5cuối cùng`

Đối với tôi, cảm giác đó giống như những gì

>>> for i in 1, 2, 3:
..   print(i)
..   try:
..     raise ValueError
..   finally:
..     print("finally 1")
..     break
..     print("finally 2")
...
1
finally 1
>>>
9 làm trong một vòng lặp. Tôi ủng hộ điều đó cho
luồng "chặn ngoại lệ"

Nhưng nó đã được thực hiện

________số 8_______

Làm rõ ví dụ

>>> for i in 1, 2, 3:
..   print(i)
..   try:
..     raise ValueError
..   finally:
..     print("finally 1")
..     break
..     print("finally 2")
...
1
finally 1
>>>

Vì vậy, chúng tôi không thể sử dụng

>>> for i in 1, 2, 3:
..   print(i)
..   try:
..     raise ValueError
..   finally:
..     print("finally 1")
..     break
..     print("finally 2")
...
1
finally 1
>>>
9, vì điều đó có thể phá vỡ mã hiện có

Tôi cho rằng sự kết hợp này với các hiệu ứng trên vòng lặp for bên ngoài
luồng điều khiển là điều khiến bạn khó chịu về ngữ nghĩa không tăng của finally?

Suy nghĩ?

Chúc mừng,
Cameron Simpson cs@cskk. nhận dạng. âu

Bởi Cameron Simpson qua Thảo luận về Python. org lúc 12 tháng 8 năm 2022 22. 59

Vì vậy, chúng tôi không thể sử dụng

>>> for i in 1, 2, 3:
..   print(i)
..   try:
..     raise ValueError
..   finally:
..     print("finally 1")
..     break
..     print("finally 2")
...
1
finally 1
>>>
9, vì điều đó có thể phá vỡ mã hiện có

Tôi cho rằng sự kết hợp này với các hiệu ứng trên vòng lặp for bên ngoài
luồng điều khiển là điều khiến bạn khó chịu về ngữ nghĩa không tăng của finally?

Tôi đang đọc lại các tài liệu ở đây

đặc biệt là đoạn bắt đầu “Nếu cuối cùng là hiện tại…”

Theo một số cách, tôi nghĩ rằng chúng ta có 2 điều đang diễn ra ở đây

  • làm rõ điều gì sẽ xảy ra nếu lập trình viên đặt
    >>> for i in 1, 2, 3:
    ..   print(i)
    ..   try:
    ..     raise ValueError
    ..   finally:
    ..     print("finally 1")
    ..     break
    ..     print("finally 2")
    ...
    1
    finally 1
    >>>
    
    9 hoặc
    try:
      something
    except ValueError as e:
      if not funky_ok_value_error(e):
        raise
    finally:
      print("something, or something not")
    
    0
    hoặc finally3 trong mệnh đề finally
  • mô tả một cách để không reraise từ finally nếu có một hiện tại
    ngoại lệ

Đối với trước đây, tôi nghĩ ngữ nghĩa hiện tại là hoàn toàn ổn. nếu
chương trình đặt một trong những câu lệnh luồng điều khiển đó vào một finally
điều khoản, nó không phải là vô lý để tôn vinh nó. Lập trình viên biết điều đó
họ đang ở trong một mệnh đề finally

Về phần sau, tôi gần như nghĩ rằng chúng ta đang lạm dụng những ngữ nghĩa này như là
cơ chế không tăng giá. Bởi vì trong mắt tôi, đó là cơ chế duy nhất
trong mệnh đề finally cho điều đó

Tôi đang đọc lại để xem văn bản có gợi ý rằng ngữ nghĩa
là để không nâng cấp lại, hoặc hoàn toàn để chỉ định những gì

>>> for i in 1, 2, 3:
..   print(i)
..   try:
..     raise ValueError
..   finally:
..     print("finally 1")
..     break
..     print("finally 2")
...
1
finally 1
>>>
9/_______2_______0/finally3 trong mệnh đề finally có nghĩa là. bây giờ tôi nghĩ rằng
sau này

Vì thế. chúng ta nên làm gì để không tăng lại một ngoại lệ trong cuối cùng
khoản?

Tôi nghĩ rằng cách tiếp cận "cuối cùng" là ngược lại;
cách tiếp cận sạch ở đây. Coi như. vắng mặt một trong những câu lệnh kiểm soát đó, một
Điều khoản finally luôn tăng lại. Trừ khi có một except để
xử lý ngoại lệ

Vì vậy, có lẽ cách rõ ràng để “không tăng lại” là xác định các trường hợp ngoại lệ
mà không nên chỉ nâng cao lại trong excepts

try:
  something
except ValueError as e:
  if not funky_ok_value_error(e):
    raise
finally:
  print("something, or something not")

Ở đây chúng tôi quyết định liệu ngoại lệ finally6 có nên tăng lại trong
except, và không có trong finally

Trên thực tế, các tài liệu nói rằng mệnh đề finally không có quyền truy cập vào
ngoại lệ hiện tại (nếu có), điều này cũng gợi ý rằng mệnh đề finally
là một nơi tồi tệ để đưa ra những quyết định này. Tất cả các quyết định đó thuộc về
trước mệnh đề except

Có ai có ví dụ ngược lại trong đó mệnh đề finally là mệnh đề duy nhất không
nơi để quyết định một cách hợp lý về việc tăng lương?

Chúc mừng,
Cameron Simpson cs@cskk. nhận dạng. âu

Hàm Python có tiếp tục sau khi trả về không?

Câu lệnh return được sử dụng để kết thúc việc thực thi lời gọi hàm và “trả về” kết quả (giá trị của biểu thức theo sau từ khóa return) cho người gọi. Các câu lệnh sau câu lệnh return không được thực thi .

Bạn có thể tiếp tục một chức năng sau khi trở về không?

Nhưng có. Không có dòng nào của hàm được thực thi sau câu lệnh return . Tuy nhiên, câu lệnh return cũng đánh dấu sự kết thúc của hàm và do đó kết thúc phạm vi.

Điều gì xảy ra sau khi trả về bằng Python?

Câu lệnh trả về trong Python là một câu lệnh đặc biệt mà bạn có thể sử dụng bên trong một hàm hoặc phương thức để gửi lại kết quả của hàm cho người gọi. Câu lệnh trả về bao gồm từ khóa trả về, theo sau là giá trị trả về tùy chọn . Giá trị trả về của hàm Python có thể là bất kỳ đối tượng Python nào.

Có chức năng tiếp tục trong Python không?

Từ khóa continue được sử dụng để kết thúc lần lặp hiện tại trong vòng lặp for (hoặc vòng lặp while) và tiếp tục đến lần lặp tiếp theo .