2012-01-19 37 views
6

Tôi có đoạn code sau đây (trừ một số các hoạt động khác):khuyến nghị cách để khởi tạo biến trong nếu khối

def foobar(): 
    msg=None 
    if foo: 
     msg='foo' 
    else: 
     msg='bar' 
    return msg 

là việc thực hành tốt hơn sau cho biến msg?

def foobar(): 
    if foo: 
     msg='foo' 
    else: 
     msg='bar' 
    return msg 

Tôi biết rằng tôi có thể đơn giản hóa các chức năng ở trên thành biểu thức thứ ba, tuy nhiên có các hoạt động trong mỗi khối if-else mà tôi đã bỏ qua.

+0

Tôi bỏ phiếu cho một giây. –

Trả lời

5

Hoặc nên được tốt nhưng tôi có lẽ sẽ làm:

def foobar(): 
    msg='bar' 
    if foo: 
     msg='foo' 
    return msg 
0

Nếu những gì bạn đã hiển thị là tất cả thông điệp đó được tham gia, thì việc khởi tạo nó không làm gì cho bạn và giải pháp thứ hai tốt hơn.

3

Trong Python không có lợi thế lớn để khởi tạo trước khi có điều kiện như trong ví dụ đầu tiên của bạn. Bạn chỉ cần chắc chắn rằng biến được khởi tạo trước khi nó được trả về. Điều đó giả định (dựa trên các ví dụ của bạn) rằng bạn đang sử dụng mô hình "một điểm thoát". Trong một số trường hợp trong Python nó là thích hợp, nhưng lần khác bạn nhận được mã sạch hơn bằng cách thoát sớm khi có thể.

def earlyReturn(mycheck): 
    if not mycheck: 
    return 'You forgot something.' 

    # code here if the test passes without needing an extra level of indentation. 
1

Tôi chắc chắn sẽ nói rằng sau này tốt hơn. Không có đề xuất nào cho Python để khởi tạo biến. Do đó, nó sẽ tránh được nếu nó không thêm một cái gì đó có giá trị cho mã như một giá trị dự phòng hoặc làm cho mã dễ đọc hơn, mà nó không làm trong trường hợp này.

Chỉnh sửa: Theo giá trị dự phòng tôi có nghĩa là giống như thagorn và mikebabcock đã đề xuất.

0

Nếu đó là toàn bộ logic, tại sao không làm:

def foobar(): 
    msg='bar' 
    if foo: 
     msg='foo' 
    return msg 
2

Tôi nhận ra rằng có một số điều bỏ qua, nhưng nếu bạn thực sự không cần phải thao tác thư, tôi tưởng tượng bạn chỉ có thể trả lại nội dung dự định mà không cần biến; return 'foo'

4

Chỉ cần cho đầy đủ, đây là một số lựa chọn thay thế một dòng để nếu/khối khác:

msg = 'foo' if foo else 'bar' 
msg = foo and 'foo' or 'bar' 
msg = ('bar', 'foo')[bool(foo)] 

Việc đầu tiên của những người chắc chắn là rõ ràng nhất, nếu bạn không thích một liner tôi sẽ đề nghị sử dụng phương pháp thứ hai của bạn hoặc câu trả lời của thagorn. Cuộc gọi bool() chỉ cần thiết trong cuộc gọi cuối cùng nếu foo chưa phải là bool (hoặc 0/1).

Rõ ràng trong chức năng ví dụ của bạn, bạn chỉ có thể trở lại này ngay lập tức mà không cần sử dụng một biến msg:

def foobar(): 
    return 'foo' if foo else 'bar' 
+0

Lời khuyên tốt và toàn diện tổng thể, nhưng họ nói rằng có nhiều xử lý hơn trong các khối điều kiện hơn là chỉ vậy. – DigitalMan

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