2010-05-31 23 views
19

tôi có một hệ thống phân tích cú pháp cho các hồ sơ văn bản cố định chiều dài dựa trên một bảng bố trí:Làm thế nào để làm cho "int" phân tích chuỗi trống?

parse_table = [\ 
    ('name', type, length), 
    .... 
    ('numeric_field', int, 10), # int example 
    ('textc_field', str, 100), # string example 
    ... 
] 

Ý tưởng là cho một bảng cho một loại tin nhắn, tôi chỉ đi qua các chuỗi, và tái tạo lại một cuốn từ điển ra của nó, theo các mục trong bảng.

Bây giờ, tôi có thể xử lý chuỗi và số nguyên thích hợp, nhưng int() sẽ không phân tích cú pháp tất cả các trường trống (vì một lý do chính đáng).

Tôi muốn xử lý nó bằng cách xác định một lớp con của int xử lý các chuỗi trống. Bằng cách này tôi có thể đi và thay đổi loại mục nhập bảng thích hợp mà không đưa vào các mã klud bổ sung trong mã phân tích (như bộ lọc), và nó sẽ "chỉ hoạt động".

Nhưng tôi không thể tìm ra cách ghi đè hàm tạo của kiểu dựng sẵn trong một loại phụ, vì việc xác định hàm tạo trong lớp con dường như không giúp ích gì. Tôi cảm thấy tôi đang thiếu một cái gì đó cơ bản ở đây về cách thức Python xây dựng trong các loại làm việc.

Tôi nên tiếp cận điều này như thế nào? Tôi cũng mở cửa cho các lựa chọn thay thế không thêm quá phức tạp.

+0

+1 ... Tôi đang cố gắng để làm một cái gì đó hơi tương tự trong dự án của tôi ... hiện tại thay vì dùng "kiểu", tôi lấy các hàm trả về kiểu thích hợp. Vì vậy, bạn có thể xử lý các chuỗi trống và * sau đó * trả về một int. – mpen

+1

Hãy thử thay thế hàm int bằng một hàm bạn muốn sử dụng thay thế. – Arafangion

+0

Bạn xử lý các trường chuỗi có độ dài cố định như thế nào? Để lại khoảng trống ở cuối trong đó? –

Trả lời

27

Sử dụng một chức năng nhà máy thay vì int hoặc một lớp con của int:

def mk_int(s): 
    s = s.strip() 
    return int(s) if s else 0 
+0

KHÔNG biết bạn có thể có điều kiện tiếp xúc sau khi trở về. Cảm ơn bạn! –

+2

@ DominicBou-Samra "a if b else c" là phiên bản Python của toán tử bậc ba, trông giống như "b? A: c" trong nhiều ngôn ngữ khác. Không có điều kiện ở đây "sau khi trở về". biểu thức bậc ba được đánh giá * trước * câu lệnh trả về. –

6
lenient_int = lambda string: int(string) if string.strip() else None 
                  #else 0 
                  #else ??? 
+0

Bạn muốn điều gì xảy ra khi bạn nhận được một chuỗi rỗng, chính xác? – badp

+0

s/trim/strip/có lẽ –

+0

Rất tiếc! Cảm ơn :) – badp

0

lưu ý rằng mylist là một danh sách có chứa:

Tuples, và bên trong các bộ, có tôi) giá trị null/rỗng, ii) các chữ số, số là chuỗi, cũng như iii) danh sách trống/không. ví dụ:

mylist=[('','1',[]),('',[],2)] 

@Arlaharen Tôi lặp lại ở đây, giải pháp của bạn, hơi khác nhau, để thêm các từ khóa, bởi vì, tôi mất rất nhiều thời gian, để tìm ra nó!

Giải pháp sau đây là tước/chuyển đổi chuỗi rỗng, chuỗi trống hoặc danh sách trống, bằng 0, NHƯNG giữ chuỗi không trống, danh sách trống, bao gồm chữ số/số dưới dạng chuỗi và sau đó chuyển đổi các chuỗi này , như số/chữ số.

Giải pháp đơn giản. Lưu ý rằng "0" có thể được thay thế bằng các biến lặp. Lưu ý rằng giải pháp đầu tiên không thể xử lý các danh sách trống bên trong bộ dữ liệu.

int(mylist[0][0]) if mylist[0][0].strip() else 0 

tôi thấy thậm chí nhiều hơn cách đơn giản hơn, mà CNTT có thể đối xử với danh sách trống rỗng trong một tuple

int(mylist[0][0] or '0') 

chuyển đổi chuỗi chữ số/chuyển đổi chuỗi số/chuyển đổi chuỗi để nguyên danh sách rỗng dải/dải chuỗi rỗng/xử lý chuỗi rỗng dưới dạng số/số chuyển đổi chuỗi rỗng thành số/số/chuyển đổi chuỗi rỗng thành số nguyên

4

Bạn có thể sử dụng hàm int() với đối số s.strip() or 0, i.e:

int(s.strip() or 0) 

Nếu s.strip() để đánh giá giá trị falsy (như là trường hợp với sản phẩm nào hoặc khoảng trắng chỉ chuỗi), thì biểu thức tổng thể s.strip() or 0 đánh giá để 0.


Hoặc nếu bạn biết rằng chuỗi sẽ luôn chỉ chứa ký tự chữ số hay là rỗng (""), sau đó chỉ cần:

int(s or 0) 
Các vấn đề liên quan