2010-11-14 26 views
5

Tôi có một chức năng được cho là lấy một chuỗi, nối thêm mọi thứ vào nó khi cần thiết và trả lại kết quả.Cách python thích hợp để viết các phương thức chỉ lấy một kiểu cụ thể là gì?

Độ nghiêng tự nhiên của tôi là chỉ trả lại kết quả, liên quan đến nối chuỗi và nếu không thành công, hãy để ngoại lệ nổi lên cho người gọi. Tuy nhiên, hàm này có một giá trị mặc định, mà tôi vừa trả về chưa sửa đổi.

Câu hỏi của tôi là: Điều gì sẽ xảy ra nếu ai đó chuyển một thứ gì đó bất ngờ đến phương thức và trả về nội dung người dùng không mong đợi? Phương pháp này sẽ thất bại, nhưng làm thế nào để thực thi điều đó?

Trả lời

5

Nó không cần thiết phải làm như vậy, nhưng nếu bạn muốn bạn có thể có phương pháp của bạn nâng cao một TypeError nếu bạn biết rằng đối tượng là một loại mà bạn không thể xử lý. Một lý do để làm điều này là giúp mọi người hiểu lý do tại sao cuộc gọi phương thức không thành công và cung cấp cho họ một số trợ giúp để sửa lỗi, thay vì cung cấp cho họ lỗi không rõ ràng từ bên trong chức năng của bạn.

Một số phương pháp trong các thư viện chuẩn làm điều này:

 
>>> [] + 1 
Traceback (most recent call last): 
    File "", line 1, in 
TypeError: can only concatenate list (not "int") to list 
+0

'/ \ breturn \ b/\ raise \ b /'. – delnan

+0

@delnan: Cảm ơn, đã khắc phục! –

1

Python hoạt động với giả định rằng tất cả chúng ta đều là người lớn thông minh rằng đọc tài liệu. Nếu bạn vẫn muốn làm điều đó, bạn không nên khẳng định loại thực tế, nhưng thay vì chỉ nắm bắt những ngoại lệ khi đối số không hỗ trợ các hoạt động bạn cần, như thế:

def foo(arg): 
    try: 
     return arg + "asdf" 
    except TypeError: 
     return arg 
+0

Ngoại trừ trường hợp ngoại lệ là hình thức xấu; tốt hơn để nói 'ngoại trừ TypeError' ở đây. –

+0

@Russel: Cảm ơn, đã khắc phục. –

2

Bạn có thể sử dụng trang trí cho các loại hình điều, bạn có thể xem một ví dụ here.

Nhưng buộc các tham số thuộc một loại cụ thể không phải là rất nhiệt đới.

0

Giá trị mặc định phải làm gì với nó? Bạn đang nói rằng bạn muốn trả về giá trị mặc định trong trường hợp người gọi không vượt qua một str? Trong trường hợp đó:

def yourFunc(foo): 
    try: 
     return foo + " some stuff" 
    except TypeError: 
     return "default stuff" 

Space_C0wb0y có câu trả lời đúng nếu bạn muốn trả lại arg chưa sửa đổi nếu nó không phải là một chuỗi, và cũng có quyền lựa chọn làm một cố gắng để chuyển đổi một cái gì đó để một chuỗi:

def yourFunc2(bar): 
    return str(bar) + " some stuff" 

Làm việc với nhiều loại khác nhau.

Các vấn đề liên quan