2011-07-05 17 views
25

Tôi gần đây đã phải thực hiện kiểm tra nhỏ cho bất kỳ biến nào có thể chưa được khởi tạo (và giá trị mặc định của chúng là None). Tôi đã đưa ra điều này:Kiểm tra xem một trong các biến có được đặt thành None

if None in (var1, var2, var3): 
    error_out() 

Trong khi, trong mắt tôi, có vẻ đẹp, tôi tự hỏi - đây có phải là cách hay không? Đây có phải là cách để làm điều đó không? Có bất kỳ trường hợp nào trong đó điều này sẽ tạo ra một số kết quả bất ngờ?

+2

Có vẻ tốt với tôi. –

+2

Tôi nghĩ rằng nó là hoàn toàn ok. – Tadeck

+1

Nó hoàn toàn tốt cho uninitialized, vì chúng tôi không quan tâm về các trường hợp góc ngớ ngẩn như 'var1 = (None,)' mà sẽ vượt qua. – smci

Trả lời

10

Trước tiên: mã của bạn là hợp lệ, có thể đọc được, súc tích ... do đó, nó có thể không phải các cách để làm điều đó (thành ngữ tiến hóa theo thời gian và các tính năng ngôn ngữ mới) nhưng nó chắc chắn là một trong những sự cách để làm điều đó theo cách nhiệt tình.

Thứ hai, chỉ hai nhận xét:

Cách thông thường để tạo ra sai sót trong python là raise Exceptions. Tất nhiên bạn có thể bọc ngoại lệ của bạn trong một chức năng, nhưng vì nó khá bất thường, tôi đã tự hỏi nếu bạn chọn thiết kế này vì một lý do cụ thể nào đó. Vì bạn có thể viết lớp Ngoại lệ của riêng bạn, ngay cả mã soạn sẵn như ghi nhật ký một thông báo lỗi vào tệp có thể đi trong chính lớp đó chứ không phải trong hàm gói.

Cách bạn đã viết thử nghiệm của mình là như vậy mà bạn sẽ không thể chỉ định None làm giá trị cho các biến của mình. Điều này có thể không phải là một vấn đề bây giờ, nhưng có thể hạn chế sự linh hoạt của bạn trong tương lai. Một cách khác để kiểm tra xem có khởi động có thể chỉ đơn giản là không tuyên bố một giá trị ban đầu cho biến trong câu hỏi và sau đó làm một cái gì đó dọc theo dòng:

try: 
    self.variable_name 
except NameError: 
    # here the code that runs if the variable hasn't been initialised 
finally: 
    # [optional] here the code that should run in either case 
+0

Trên thực tế, việc thực hiện đúng, cuối cùng sẽ làm tăng "Ngoại lệ". Cảm ơn rất nhiều câu trả lời và quan sát sâu sắc. – maligree

7

Một cách chỉ hơi khác nhau để làm điều đó sẽ được sử dụng the built-in all method; Tuy nhiên, điều này cũng sẽ bắt các giá trị sai-ish như 0 hoặc "", mà có thể không được những gì bạn muốn:

>>> all([1, 2, 3]) 
True 
>>> all([None, 1, 2]) 
False 
>>> all([0, 1]) 
False 
+1

Những điều này không làm những gì mà OP yêu cầu. "" và 0 được khởi tạo , Không có không. – smci

+0

Có thể không phải là những gì OP yêu cầu, nhưng điều này trong thực tế phù hợp với một số trường hợp sử dụng thậm chí còn thích hợp hơn so với câu trả lời được chấp nhận! – Angad

3

Cho phép tôi rời hai xu của tôi ở đây:

>>> any(a is None for a in [1,0]) 
False 
>>> any(a is None for a in [1,0, None]) 
True 

Vì vậy, người ta có thể:

def checkNone(*args): 
    if any(arg is None for arg in args): 
     error_out() 

Không có gì mới ở đây. Chỉ IMHO có thể là phần any arg is None dễ đọc hơn

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