2009-03-23 36 views
12

Tại sao list.index ném ngoại lệ, thay vì sử dụng giá trị tùy ý (ví dụ: -1)? Ý tưởng đằng sau điều này là gì?Python list.index ném ngoại lệ khi chỉ mục không tìm thấy

Đối với tôi, giao diện của nó trông sạch sẽ hơn với các giá trị đặc biệt, thay vì ngoại lệ.

EDIT: Tôi không nhận ra -1 là giá trị tiềm năng hợp lệ. Tuy nhiên, tại sao không phải cái gì khác? Làm thế nào về một giá trị của Không?

Trả lời

12

Bởi vì -1 chính nó là một chỉ mục hợp lệ. Nó có thể sử dụng một giá trị khác, chẳng hạn như None, nhưng điều đó sẽ không hữu ích, trong đó -1 có thể ở trong các tình huống khác (do đó str.find()), và sẽ chỉ đơn giản là kiểm tra lỗi, đó chính xác là ngoại lệ.

3

Trong Python, -1 là một chỉ số có giá trị, có nghĩa là một số từ cuối danh sách (thay vì đầu), vì vậy nếu bạn đã làm

idx = mylist.index(someval) 
nextval = mylist[idx+1] 

sau đó bạn sẽ nhận được giá trị đầu tiên của mảng, thay vì nhận ra có lỗi. Bằng cách này bạn có thể bắt được ngoại lệ và đối phó với nó. Nếu bạn không muốn trường hợp ngoại lệ, sau đó chỉ cần kiểm tra trước:

if someval in mylist: 
    idx = mylist.index(someval) 

Edit: Không có thực sự bất kỳ điểm nào trong trở lại Không, bởi vì nếu bạn đang đi để kiểm tra Không, bạn cũng có thể kiểm tra xem giá trị có trong danh sách như trên!

6

Vâng, giá trị đặc biệt thực sự phải là None, vì -1 là chỉ mục hợp lệ (có nghĩa là phần tử cuối cùng của danh sách).

Bạn có thể bắt chước hành vi này bằng cách: ý tưởng

idx = l.index(x) if x in l else None 
+2

Miễn là bạn không nhớ tìm kiếm trong danh sách hai lần .. –

+2

tốt, đó là hoặc thử/ngoại trừ. – vartec

1

Một đơn giản: -1 là hoàn toàn có thể sử dụng như một chỉ số (như là những giá trị tiêu cực khác).

8

Để thêm vào phản hồi của Devin: Đây là cuộc tranh luận cũ giữa các giá trị trả về đặc biệt so với trường hợp ngoại lệ. Nhiều lập trình viên rất thích một ngoại lệ bởi vì trên một ngoại lệ, tôi nhận được để xem toàn bộ stacktrace và ngay lập tức suy ra những gì là sai.

+1

Đây là những gì tôi đã tự hỏi: giá trị trả về đặc biệt so với trường hợp ngoại lệ. –

+3

+1: Ngoại lệ không phụ thuộc vào một số giá trị là "thiêng liêng". Các ngoại lệ thường đơn giản hơn để làm việc. –

+0

Các folks ngoại trừ có thể lập luận rằng 'chỉ số' không tìm thấy một đối tượng không phải là một lỗi, và ngoại lệ chỉ nên được sử dụng trên các lỗi. Tôi cho trường hợp ngoại lệ trong trường hợp này. Trường hợp ngoại lệ có thể nhanh hơn vì họ không phải thực hiện kiểm tra thành công. Python thích ngoại lệ trong nhiều trường hợp do điều này. Nói cách khác, nếu 'index' tìm thấy một đối tượng, thì việc thực hiện tiếp tục mà không kiểm tra điều kiện. Nếu 'index' không tìm thấy gì, bạn sẽ bị ném vào khối catch mà không có kiểm tra. –

1

Đó là một đối số ngữ nghĩa. Nếu bạn muốn biết chỉ mục của một phần tử, bạn đang tuyên bố rằng nó đã tồn tại trong danh sách. Nếu bạn muốn biết có tồn tại hay không, bạn nên sử dụng in.

+1

... và nếu bạn tuyên bố rằng nó tồn tại một ngoại lệ là cách chính xác để xử lý nó. –

2

Tôi đồng ý với Devin Jeanpierre và sẽ thêm rằng việc xử lý các giá trị đặc biệt có thể trông tốt trong các trường hợp ví dụ nhỏ nhưng (với một vài ngoại lệ đáng chú ý, ví dụ như NaN trong FPU và Null trong SQL) . Lần duy nhất mà nó hoạt động là nơi:

  • Bạn đã thường nhận được rất nhiều xử lý đồng nhất lồng nhau (ví dụ như toán học hoặc SQL)
  • Bạn không quan tâm đến việc phân biệt các loại lỗi
  • Bạn không quan tâm nơi xảy ra lỗi
  • Các hoạt động là các hàm thuần túy, không có tác dụng phụ.
  • Thất bại có thể được đưa ra một ý nghĩa hợp lý ở cấp cao hơn (ví dụ "Không có hàng phù hợp")
3

Đó chủ yếu là để đảm bảo rằng các lỗi được phát hiện càng sớm càng tốt. Ví dụ, hãy xem xét những điều sau đây:

l = [1, 2, 3] 
x = l.index("foo") #normally, this will raise an error 
l[x] #However, if line 2 returned None, it would error here 

Bạn sẽ nhận thấy rằng một lỗi sẽ được ném vào l[x] chứ không phải tại x = l.index("foo") nếu chỉ số đã trở về None. Trong ví dụ này, đó không thực sự là một vấn đề lớn. Nhưng hãy tưởng tượng rằng dòng thứ ba ở một nơi hoàn toàn khác trong chương trình hàng triệu. Điều này có thể dẫn đến một chút ác mộng.

4

Cuộc tranh luận "giá trị so với lỗi" là một phần về độ rõ của mã. Xem xét mã có giá trị lỗi:

idx = sequence.index(x) 
if idx == ERROR: 
    # do error processing 
else: 
    print '%s occurred at position %s.' % (x, idx) 

Xử lý lỗi kết thúc ở giữa thuật toán của chúng tôi, che khuất luồng chương trình. Mặt khác:

try: 
    idx = sequence.index(x) 
    print '%s occurred at position %s.' % (x, idx) 
except IndexError: 
    # do error processing 

Trong trường hợp này, số lượng mã có hiệu quả giống nhau, nhưng thuật toán chính không bị gián đoạn do xử lý lỗi.

0
def GetListIndex(list, searchString): 
    try: 
     return list.index(searchString) 

    except ValueError: 
     return False 

    except Exception: 
     raise 
Các vấn đề liên quan