2014-05-09 11 views
5

Tôi có một chức năngLàm thế nào để kiểm tra xem len là hợp lệ

def foo(bar): 
    #do some things 
    len(bar) 

Nếu tôi gọi

foo(42) 

nó ném một ngoại lệ của

TypeError: object of type 'int' has no len()

Làm thế nào để kiểm tra xem các bước giá trị có thể được sử dụng với len()?

Trả lời

8

Bạn có thể làm:

if hasattr(bar, '__len__'): 
    pass 

Ngoài ra, bạn có thể bắt TypeError.

+2

Điều này không cần phải là '__len__ trong dir (bar) '? Dù bằng cách nào, sử dụng 'hasattr' thì tốt hơn nếu bạn đi theo phương pháp này – Daenyth

+0

Ngay cả đối tượng có thuộc tính' __len__', nó không có nghĩa là nó hợp lệ (hoặc OP nên xác định cái gì là ** hợp lệ **). Ví dụ, một lớp có thể định nghĩa một hàm '__len__' trả về một' str', và nó sẽ vượt qua bài kiểm tra 'hasattr' nhưng vẫn ném ngoại lệ' TypeError' khi bạn gọi 'len()' trên nó. Đây là chính xác những gì ** xử lý ngoại lệ ** được thiết kế cho, trừng phạt chúng cho tôi đầu vào bẩn. – Nier

5

Bạn có thể làm điều đó bằng tryexcept cho kết quả tốt nhất:

def foo(bar): 
    #do some things 
    try: 
     print(len(bar)) 
    except TypeError: 
     print('Input not compatible with len()') 
4

Bạn có thể kiểm tra nếu đối tượng là Sized:

import collections 

if isinstance(bar, collections.Sized): 

Các thử nghiệm isinstance() là đúng nếu tất cả các phương pháp trừu tượng của Sized được thực hiện; trong trường hợp này chỉ là __len__.

Cá nhân, tôi chỉ muốn nắm bắt những ngoại lệ thay vì:

try: 
    foo(42) 
except TypeError: 
    pass # oops, no length 
+0

+1 cho 'Sized'. – Daenyth

2

Kể từ len()calls __len__() magic method dưới mui xe, bạn có thể kiểm tra xem một đối tượng có __len__ phương pháp định nghĩa với sự giúp đỡ của hasattr():

>>> def has_len(obj): 
...  return hasattr(obj, '__len__') 
... 
>>> has_len([1,2,3]) 
True 
>>> has_len('test') 
True 
>>> has_len(1) 
False 
Các vấn đề liên quan